如何阻止查找结果下降到找到的目录?


24

我想查找具有特定字符串的所有目录,以便可以对其中包含的文件进行另一个查找。

所以我不想浪费时间在其他地方./my-search-term/dir/my-search-term

找到第一个my-search-term目录后,如何停止递归?


3
您是否尝试使用-prune查找?在手册页中:“如果文件是目录,则不要进入该目录。如果给定-depth,则为false;没有效果。因为-delete暗含-depth,因此不能有效地将-prune和-delete一起使用。”
laebshade

1
@laebshade你为什么不回答呢?
jw013

@ jw013当时我没有时间提供更深入的答案。
laebshade

Answers:


17

-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
rozcietrzewiacz 2011年

@rozcietrzewiacz不,没有必要。-o我猜有在那儿的习惯。而且我认为放在-prune前面-exec更容易理解。
吉尔斯(Gilles)'所以

谢谢,以前没有使用过该-prune选项。
haridsv 2015年

在我的用例中,此命令: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。解决方案是-prunefind命令末尾添加。
haridsv 2015年

(1)某些版本的findexpand,{}即使它显示为的参数的子字符串-exec。这样的版本find会阻塞您的第二个命令,因为{}内部find命令(在shell命令中)中的in将被在external中找到的目录名代替find。您可以这样说来解决,find . -name my-search-term -prune -exec sh -c 'find "$0" … -exec … "{"} +' {} \; 即使用"{"}shell将变成的{}。…(续)
斯科特

6

-裸解决方案-

如果要find跳过找到的目录的内容,但继续在其他目录中搜索,请-prune按照建议使用@laebshade。完整的命令应该看起来像

 find . -type d -name somename -prune -exec ...

在另一方面,如果你想find完全停止搜索并找到第一个匹配的目录后,那么你正在寻找的是-quit(因为版本4.2.3GNU 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”。

的一个棘手元素-ofind可以“优化”您的命令,并且-exec如果您仅键入内容就不能运行该零件

find . -type d -name somename -exec ... -o -quit

为了解决这个问题,您可以find通过将所有谓词括在圆括号中来强制评估所有谓词“ OR”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.