我想查找具有特定字符串的所有目录,以便我可以对其中包含的文件进行另一次查找。
所以我不想把时间浪费在./my-search-term/dir/my-search-term
诸如此类的事情上。
当我找到第一个 my-search-term 目录时,如何停止递归?
答案1
该-prune
操作find
不会递归到目录中。您可以将其与另一个操作结合起来,例如(和-exec
的顺序并不重要,只要以任何一种方式执行即可)。-prune
-exec
-prune
find . -name my-search-term -prune -exec find {} … \;
请注意,嵌套find
在 a 内部find -exec
可能会有点问题:您不能-exec
在 inside 中使用find
,因为终止符会被 external 视为终止符find
。您可以通过调用 shell 来解决这个问题,但要注意引用。
find . -name my-search-term -prune -exec sh -c '
find "$@" … -exec … {\} +
' _ {} +
答案2
- 裸解决方案 -
如果您想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
回报真的(换句话说,一个零地位)。如果您希望-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
只有当整个前一部分没有返回时,才会执行最后一个操作(例如)错误的。默认情况下,所有测试都以逻辑“AND”连接,该-o
选项将连接更改为“OR”。
一个棘手的元素-o
是,如果您只键入,find
可以“优化”您的命令并且不会运行该部分-exec
find . -type d -name somename -exec ... -o -quit
为了解决这个问题,您可以强制find
评估所有以“OR”连接的谓词,方法是将它们括在括号内。
答案3
不确定这是否是您要查找的内容,但“maxdepth”选项不允许 find 命令超出当前目录。我还认为您可以在查找中添加通配符:
$> find /your/dir -name '*mystring*' -maxdepth 1 -type d -exec my_action {} \;
-姓名 '我的字符串'将查找所有匹配的文件'我的字符串'。请介意单引号。 -maxdepth 1 查找不超出当前目录的文件。 -maxdepth 2 将在当前目录和另一级目录中查找文件,依此类推。 -type d 查找属于目录的文件。 -type f 查找常规文件等。
我的0.02...^_^