在 for 循环中循环遍历每个目录的正确方法是什么?

在 for 循环中循环遍历每个目录的正确方法是什么?

例如,在这个 for 循环中

for var in ?????
do
    dummy command
done

我希望能够循环遍历当前所在目录中的每个目录,但这将是一个未知的目录列表,因此我无法将每个目录写入问号所在的位置。任何帮助表示赞赏。

答案1

最简单的,就是满足你的要求“循环遍历我当前所在目录中的每个目录",只需使用通配符

for d in */
do
    dummy_command "$d"
done

如果您的命令无法处理 的尾部斜杠,您可以通过替换为 来$d删除它。"$d""${d%/}"

如果您的命令可以接受多个参数,则根本不需要循环

dummy_command */

dummy_command测试的一个例子可能很简单echo

注意在所有情况下,如果模式不匹配*/,它将作为字面星号和斜杠传递给您的命令。这几乎肯定不是您想要的。

因为bash您可以通过在循环上方添加此行来修复它,但请注意它将从该点开始应用

shopt -s nullglob    # Expand unmatched wildcards to "nothing"

...直到你有一个对应的shopt -u nullglob或者你的脚本结束

答案2

如果您想要更多地控制诸如最小/最大深度之类的事情,您可以在 while 循环中使用 find :

while IFS= read -r dir; do
    echo "$dir"
done < <(find . -type d)

然后,只需更改您的查找选项即可满足您的需要。就像如果您正在寻找带有空格的目录名称一样,您可以这样做find . -type d -name '* *'

答案3

像这样(递归地列出文件名中带有空格的目录):

shopt -s globstar
dummy_command **/*' '*/

或者如果您坚持使用 for 循环:

shopt -s globstar
for dir in **/*' '*/
    dummy_command "$dir"
done

相关内容