如何在zsh中循环遍历特定路径下的所有文件?

37

以下是我目前为止所拥有的内容:

for file in $(find /path/to/directory -type f); echo $file; done

但是我遇到了这个错误:

zsh: parse error near `done'

在第一个分号后缺少 do - AmaJayJB
2个回答

98

不需要使用find。你可以尝试以下方法:

for file in /path/to/directory/**/*(.); do echo $file; done
或者
for file in /path/to/directory/**/*(.); echo $file

你获得错误的原因是最后一点:当在循环中运行单个命令时,你需要同时使用dodone或不使用它们。如果你想在循环中运行多个命令,则必须使用它们。


如果找不到任何文件,这将打印出一个错误。如何禁用该消息? - Lars Nyström
2
@LarsNyström 您可以在全局限定符中添加 N,例如 for file in /path/to/directory/**/*(N.); echo $file。这将为该模式设置 NULL_GLOB 选项,它会将该模式从参数列表中删除而不是报告错误。因此,如果没有匹配的文件存在,则该命令将有效地被缩减为 for file in ; echo $file - Adaephon
答案是在zsh中利用伟大功能的宝藏。 非常棒的解释和参考。 - Ari
在脚本中的第一行不要忘记加上 #!/bin/zsh zsh。 - undefined

4

您能检查一下是否像这样在$file周围添加""解决了此问题:

for file in $(find /path/to/directory -type f); echo "$file"; done

编辑:

echo之前添加do,并告诉我是否解决了问题:

for file in $(find /path/to/directory -type f); do echo "$file"; done

1
zsh 中,默认情况下禁用了单词拆分(除非您设置了 sh_word_split),并且引用变量不起作用,这与 bash 不同。 - Radon Rosborough

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接