以下是我目前为止所拥有的内容:
for file in $(find /path/to/directory -type f); echo $file; done
但是我遇到了这个错误:
zsh: parse error near `done'
不需要使用find
。你可以尝试以下方法:
for file in /path/to/directory/**/*(.); do echo $file; done
或者for file in /path/to/directory/**/*(.); echo $file
**
通配符可以递归地匹配多个目录。因此,a/**/b
会匹配在a
下任何一个位置存在的文件b
。本质上等同于find a -name b
命令所产生的列表。(.)
是通配限定符,告诉zsh只匹配普通文件。它相当于find
命令的-type f
选项。$file
周围加上双引号,因为zsh在变量替换时不会将其拆分成单词。for
循环的常规形式;第二个版本是简写形式,不需要使用do
和done
关键字。你获得错误的原因是最后一点:当在循环中运行单个命令时,你需要同时使用do
和done
或不使用它们。如果你想在循环中运行多个命令,则必须使用它们。
N
,例如 for file in /path/to/directory/**/*(N.); echo $file
。这将为该模式设置 NULL_GLOB
选项,它会将该模式从参数列表中删除而不是报告错误。因此,如果没有匹配的文件存在,则该命令将有效地被缩减为 for file in ; echo $file
。 - Adaephon#!/bin/zsh
zsh。 - undefined您能检查一下是否像这样在$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
zsh
中,默认情况下禁用了单词拆分(除非您设置了 sh_word_split
),并且引用变量不起作用,这与 bash
不同。 - Radon Rosborough
do
。 - AmaJayJB