对于 UNIX 来说相当新。尝试创建一个脚本来循环遍历给定目录的所有文件和子目录并打印它们。我希望能够动态跳过某些目录。
我的想法是创建一个 for 循环,for i in $(find ./ -printf '%f\n')
因为这将迭代给定目录中的所有内容,但我很好奇是否有一种方法可以跳过一个目录,如果我遇到一个我不想继续下去的目录。如在
if [ "$i" == something I don't want to go down ]
then
skip this directory
fi
不确定这是否可能。找到了使用 prune 函数跳过目录的方法,但这需要您事先知道要跳过的类型,至少这是我的理解。谢谢。
答案1
是的,-exec
是一个谓词,就像 , 一样-name
,并且find
会考虑命令的退出状态,如果它非零,则将其视为 false。
但请注意A)这仅适用于表格,-exec ... \;
不是到形式(这总是正确的)和-exec .. {} +
b)为每个文件或目录分叉一个单独的进程是慢的。
例如,这将跳过包含名为 的文件的所有目录foo.txt
:
find . -type d -exec test -f {}/foo.txt \; -prune -or -print
$ mkdir -p a/{1,2,3}/{x,y,z}; touch a/{1,2,3}/{x,y,z}/a.txt
$ find . -type d -exec test -f {}/foo.txt \; -prune -or -print
... lots of files ...
$ touch a/{1,2}/foo.txt a/3/{x,y}/foo.txt
$ find . -type d -exec test -f {}/foo.txt \; -prune -or -print
.
./a
./a/3
./a/3/z
./a/3/z/a.txt
当然,test -f ...
您可以使用例如代替静态命令。path/to/some/script {} ...
。通过 GNU find(Linux 中的默认设置),您可以-execdir
使用-exec
.