我想找到具有特定字符串的所有目录,以便我可以对其中包含的文件进行另一次查找。
所以我不想浪费时间在./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)
如果您想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”。
一个棘手的元素-o是find可以“优化”您的命令,并且-exec如果您只键入,则不会运行该部分
find . -type d -name somename -exec ... -o -quit
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,您可以find通过将它们括在括号中来强制评估所有与“OR”相连的谓词。
| 归档时间: |
|
| 查看次数: |
23054 次 |
| 最近记录: |