在 Bash 中递归地循环遍历目录
本篇文章介绍了如何在 Bash 中递归循环遍历目录。
在 Bash 中递归地循环遍历目录
在处理不同的目录时,通常需要遍历目录。 我们可以在包括 Bash 在内的所有 Linux 终端中使用类似的命令来递归地循环遍历目录。
首先,我们使用find 命令查看当前目录的结构。 find 命令将显示当前或给定目录中的所有文件和文件夹。
查看所有文件:
find . -type f -print0
要查看特定目录的文件:
find /mnt/c/Users/Sheeraz/DemoFolder1 -type f -print0
/mnt/c/Users/Sheeraz/DemoFolder1 是我们要检查的目录路径。
-type f 选项用于仅获取该目录的文件而不是文件夹。 此命令的输出如下。
/mnt/c/Users/Sheeraz/DemoFolder1/Jiyik.java/mnt/c/Users/Sheeraz/DemoFolder1/jiyik.rtf/mnt/c/Users/Sheeraz/DemoFolder1/demo.bmp/mnt/c/Users/Sheeraz /DemoFolder1/DemoFolder2/Jiyik.java/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/jiyik.rtf/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/demo.bmp/mnt/c/Users/Sheeraz/DemoFolder1 /DemoFolder2/Example1.java/mnt/c/Users/Sheeraz/DemoFolder1/Example1.java/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/Jiyik.java/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/jiyik .rtf/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/demo.bmp/mnt/c/Users/Sheeraz/D
如果您还想获取目录的文件夹,请从上述命令中删除 -type f。
find /mnt/c/Users/Sheeraz/DemoFolder1 -print0
一旦我们知道了文件名结构,我们就可以使用以下代码递归循环遍历目录:
for x in $(find /mnt/c/Users/Sheeraz/DemoFolder1 -type f -print0)
do
echo $x;
done;
上面的代码递归地循环遍历目录 /mnt/c/Users/Sheeraz/DemoFolder1 并回显每个文件的名称。 查看此命令的输出:
/mnt/c/Users/Sheeraz/DemoFolder1/Jiyik.java/mnt/c/Users/Sheeraz/DemoFolder1/jiyik.rtf/mnt/c/Users/Sheeraz/DemoFolder1/demo.bmp/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/Jiyik.java/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/jiyik.rtf/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/demo.bmp/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/Example1.java/mnt/c/Users/Sheeraz/DemoFolder1/Example1.java/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/Jiyik.java/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/jiyik.rtf/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/demo.bmp/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/Example1.java
递归循环目录以获取具有特定扩展名的文件
如我们所见,我们不需要显示或处理所有文件。 我们还可以将此命令与 -name 选项一起使用,以获取具有特定扩展名的文件。
查看命令:
for x in $(find /mnt/c/Users/Sheeraz/DemoFolder1 -type f -name '*.java');
do
echo $x;
done;
上面的代码只会打印 /mnt/c/Users/Sheeraz/DemoFolder1 中扩展名为 .java 的文件。 查看输出:
/mnt/c/Users/Sheeraz/DemoFolder1/Jiyik.java
/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/Jiyik.java
/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/Example1.java
/mnt/c/Users/Sheeraz/DemoFolder1/Example1.java
/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/Jiyik.java
/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/Example1.java
递归循环目录以将文件移动到另一个目录
我们还可以通过使用 Bash mv 命令递归循环目录来移动文件; 此命令的语法如下。
mv -v $filename $destination directory
我们可以在递归循环中使用此命令将文件移动到目标目录。 让我们举个例子。
for x in $(find /mnt/c/Users/Sheeraz/DemoFolder1 -type f -name '*.java');
do
mv -v $x /mnt/c/Users/Sheeraz/DemoFolder2
done;
DemoFolder2 是一个空目录。
输出:
renamed '/mnt/c/Users/Sheeraz/DemoFolder1/Jiyik.java' -> '/mnt/c/Users/Sheeraz/DemoFolder2/Jiyik.java'
renamed '/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/Jiyik.java' -> '/mnt/c/Users/Sheeraz/DemoFolder2/Jiyik.java'
renamed '/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/Example1.java' -> '/mnt/c/Users/Sheeraz/DemoFolder2/Example1.java'
renamed '/mnt/c/Users/Sheeraz/DemoFolder1/Example1.java' -> '/mnt/c/Users/Sheeraz/DemoFolder2/Example1.java'
renamed '/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/Jiyik.java' -> '/mnt/c/Users/Sheeraz/DemoFolder2/Jiyik.java'
renamed '/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/Example1.java' -> '/mnt/c/Users/Sheeraz/DemoFolder2/Example1.java'
正如我们所见,该命令递归循环遍历目录并将扩展名为 java 的文件移动到目标目录。
递归循环遍历目录以删除文件
我们可以使用 rm -rf
命令从给定目录中删除文件。 此命令的语法如下。
rm -rf $filename
让我们把这个命令放在一个递归循环中,以递归地从目录中删除所有文件。
for x in $(find /mnt/c/Users/Sheeraz/DemoFolder1 -type f);
do
rm -rf $x
done;
上述脚本将删除主目录和子目录中的所有文件; 它不会删除该文件夹,因为在命令中只选择了文件。 查看输出:
相关文章
在 Bash 中运行 find -exec 命令
发布时间:2024/03/14 浏览次数:127 分类:操作系统
-
本文将演示如何使用 find 命令的 -exec 参数来使用 find 命令定位文件中的任何文本。