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

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

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

所以我不想把时间浪费在./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完全停止搜索找到第一个匹配的目录后,您要查找的是-quit4.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...^_^

相关内容