我想查找具有特定字符串的所有目录,以便可以对其中包含的文件进行另一个查找。
所以我不想浪费时间在其他地方./my-search-term/dir/my-search-term
。
找到第一个my-search-term目录后,如何停止递归?
我想查找具有特定字符串的所有目录,以便可以对其中包含的文件进行另一个查找。
所以我不想浪费时间在其他地方./my-search-term/dir/my-search-term
。
找到第一个my-search-term目录后,如何停止递归?
Answers:
该-prune
操作find
不会递归到目录中。您可以与其他动作结合起来,如-exec
(顺序-prune
和-exec
无所谓,只要-prune
执行两种方式)。
find . -name my-search-term -prune -exec find {} … \;
请注意,find
在a内嵌套find -exec
可能会有一些问题:您不能-exec
在内部使用find
,因为终止符会被外部视为终止符find
。您可以通过调用Shell来解决此问题,但是要小心引用。
find . -name my-search-term -prune -exec sh -c '
find "$@" … -exec … {\} +
' _ {} +
-prune
返回true,可以放在之前-exec
。
-o
我猜有在那儿的习惯。而且我认为放在-prune
前面-exec
更容易理解。
-prune
选项。
mkdir -p x1 x2; touch x1/x11 x1/x12 x2/x21 x2/x22; find . -name 'x1*' -exec rm -rf {} \;
给出错误:find: ./x1: No such file or directory
。解决方案是-prune
在find
命令末尾添加。
find
expand,{}
即使它显示为的参数的子字符串-exec
。这样的版本find
会阻塞您的第二个命令,因为{}
内部find
命令(在shell命令中)中的in将被在external中找到的目录名代替find
。您可以这样说来解决,find . -name my-search-term -prune -exec sh -c 'find "$0" … -exec … "{"} +' {} \;
即使用"{"}
shell将变成的{}
。…(续)
如果要find
跳过找到的目录的内容,但继续在其他目录中搜索,请-prune
按照建议使用@laebshade。完整的命令应该看起来像
find . -type d -name somename -prune -exec ...
在另一方面,如果你想find
完全停止搜索并找到第一个匹配的目录后,那么你正在寻找的是-quit
(因为版本4.2.3
的GNU find
)。这一点使用起来比较棘手,因为它会find
立即退出-因此-quit
必须放在命令的最后:
find . -type d -name somename -exec ... -quit
为了使它按预期工作,必须确保-exec
返回的结果为true(换句话说,零状态)。如果要-exec
忽略的退出状态,以便-quit
始终运行,则需要一些技巧:
find . -type d -name somename \( -exec ... -o -true \) -quit
要么
find . -type d -name somename \( -exec ... -o -quit \)
要么
find . -type d -name somename \( -exec ... , -quit \) # a comma before -quit
关于find
工作方式的最重要的事情是将所有动作(“测试”)都视为从左到右解释的逻辑谓词。因此,-quit
仅当整个前一部分未返回false时,才执行最后一个动作(例如)。默认情况下,所有测试都使用逻辑“ AND”进行联接,该-o
选项将联接更改为“ OR”。
的一个棘手元素-o
是find
可以“优化”您的命令,并且-exec
如果您仅键入内容就不能运行该零件
find . -type d -name somename -exec ... -o -quit
为了解决这个问题,您可以find
通过将所有谓词括在圆括号中来强制评估所有谓词“ OR”。