Linux中遍历目录的方法
1. 概述
在各种情况下,我们可能想要遍历给定文件夹中的所有目录。例如,我们可能想要遍历所有目录并在每个文件夹中运行特定命令。
在本教程中,我们将了解如何使用 Linux 命令仅遍历特定文件夹中的目录。我们将在示例中使用Bash shell,但这些命令也可以在其他 POSIX shell 中使用。
2. 基本的for循环
让我们从 Bash 提供的基本循环结构之一开始。快速回顾一下,for 循环被归类为迭代语句。它需要一个字符串列表作为输入,并允许对每个项目重复执行代码,直到达到某个条件或我们到达列表的末尾。
现在我们了解了基本的for循环结构,在接下来的小节中,我们将解释两种不同的目录循环方式。
2.1.仅模式匹配目录
我们将首先使用通配符模式来匹配多个文件作为for循环的输入:
for dir in */; do
echo "$dir"
done
让我们更详细地解释一下我们在上面的示例中所做的事情:
- 我们使用匹配所有文件的标准通配符 glob 模式“*”。通过添加一个’/‘之后,我们将只匹配目录
- 然后,我们将每个目录分配给变量dir的值
- 在我们的简单示例中,我们然后在do和done之间执行*echo 命令以简单地输出变量dir*的值
然后我们回到顶部,抓取列表中的下一个目录,然后重复直到到达列表的末尾。
请注意,虽然很优雅,但此解决方案有一个缺点。它假设我们在当前文件夹中至少有一个可用的目录。如果不存在目录,则循环将执行一次并输出可能不需要的“*/”。
在下一个示例中,我们将看到解决此问题的解决方案。
2.2. 使用目录文件测试运算符
现在,我们将了解如何使用文件测试运算符 之一来确定列表中的文件项是否为目录:
for file in *; do
if [ -d "$file" ]; then
echo "$file"
fi
done
在这个例子中,我们遍历当前目录中的所有文件。然后使用标准if 语句,我们可以使用-d标志测试文件*变量是否是目录。* 如果此条件返回true,我们只需 使用echo命令输出文件的值。
3. 使用find命令
在本节中,我们将看到如何使用find 命令打印出当前文件夹中的目录列表:
find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n'
让我们更详细地看一下该命令以正确理解它:
- 我们以“.”开头。用于表示当前目录
- maxdepth参数表示从起点下降到的目录级别
- 然后我们使用值为 1 的mindepth参数来处理除起始点以外的所有文件——这意味着 ‘.’ 不会包含在结果中。
- -type d参数用于仅包含目录
- 最后,我们使用printf只打印文件夹的名称,并为每个结果加上一个新行。
这个例子只是一个简单的演示,但实际上,我们可能想做的不仅仅是打印出目录的名称。在下一节中,我们将看到上述内容的变体。
4. 结合find和while read循环
在这个倒数第二个示例中,我们将看到如何使用 find 命令,就像我们在上一节中所做的那样,但这次将它与*while read*循环结合起来,为我们找到的每个目录执行一个命令。
根据我们的for循环示例,我们将简单地回显文件夹的名称:
find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
echo "$dir"
done
在此示例中,我们没有使用printf参数来输出文件夹名称,而是将每个结果通过管道传输到 while 循环中。我们将每个目录的值分配给一个名为dir的变量,然后简单地echo该变量的值。
5. 使用find和exec参数
在最后一个示例中,我们将探索一个可以说更优雅、更简洁的解决方案,用于为我们找到的每个目录执行命令。 根据前面的示例,我们将简单地echo文件夹的名称,但这次使用-exec*参数*:
find . -maxdepth 1 -type d -exec echo {} \;
使用-exec*动作,我们可以对选定的文件运行指定的命令*。在我们的示例中,echo将 {} 替换为找到的文件名。命令的最后一部分是转义的 ‘;’ 仅仅意味着执行每个文件的单个回显命令。