迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 操作系统 >

在 Bash 中递归地循环遍历目录

作者:迹忆客 最近更新:2023/05/18 浏览次数:

本篇文章介绍了如何在 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 是一个空目录。

Destination Directory before Moving

输出:

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;

上述脚本将删除主目录和子目录中的所有文件; 它不会删除该文件夹,因为在命令中只选择了文件。 查看输出:

Remove File from Directory

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便