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

Ste*_*hen 31 find recursive

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

所以我不想浪费时间在./my-search-term/dir/my-search-term等上。

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

Gil*_*il' 23

-prune操作find不会递归到目录中。您可以与其他动作结合起来,如-exec(顺序-prune-exec无所谓,只要-prune执行两种方式)。

find . -name my-search-term -prune -exec find {} … \;
Run Code Online (Sandbox Code Playgroud)

请注意,find在 a中嵌套find -exec可能有点问题:您不能-exec在内部使用find,因为终止符会被外部视为终止符find。您可以通过调用 shell 来解决这个问题,但要注意引用。

find . -name my-search-term -prune -exec sh -c '
    find "$@" … -exec … {\} +
' _ {} +
Run Code Online (Sandbox Code Playgroud)


roz*_*acz 8

- 裸解决方案 -

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

 find . -type d -name somename -prune -exec ...
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您想在找到第一个匹配目录后find完全停止搜索,那么您要查找的是-quit(自 版本4.2.3起可用GNU find)。这个使用起来有点棘手,因为它会find立即退出 - 所以-quit必须放在命令的最后:

find . -type d -name somename -exec ... -quit
Run Code Online (Sandbox Code Playgroud)

要使其按预期工作,必须确保-exec返回true(换句话说,状态)。如果您希望-exec忽略退出状态,以便-quit始终有效,则需要一个小技巧:

find . -type d -name somename \( -exec ... -o -true \) -quit
Run Code Online (Sandbox Code Playgroud)

或者

find . -type d -name somename \( -exec ... -o -quit \)
Run Code Online (Sandbox Code Playgroud)

或者

find . -type d -name somename \( -exec ... , -quit \) # a comma before -quit
Run Code Online (Sandbox Code Playgroud)

- 一些解释 -

关于如何find工作的最重要的事情是所有动作(“测试”)都被视为从左到右解释的逻辑谓词。因此,-quit只有在整个前一部分没有返回false 时,才会执行最后一个操作(例如)。默认情况下,所有测试都使用逻辑“AND”连接,该-o选项将连接更改为“OR”。

一个棘手的元素-ofind可以“优化”您的命令,并且-exec如果您只键入,则不会运行该部分

find . -type d -name somename -exec ... -o -quit
Run Code Online (Sandbox Code Playgroud)

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