是否可以链接两个连续的 find 命令?

是否可以链接两个连续的 find 命令?

我想要:

  • 查找所有以大写字母开头的目录
  • 然后,在这些目录中找到所有名为“.git”的目录

这是为了性能优化。我的解决方案是首先将搜索范围缩小到特定目录,然后在其中搜索。

对于第一个,我的想法是:

find / -mindepth 1 -maxdepth 1 -name "[[:upper:]]*"

对于第二个,我使用的是:

find / -type d -name ".git" 2>/dev/null

现在我不知道如何将它们链接在一起。我希望第二个find只搜索第一个的结果find

或者,如果是 XY 问题,请告诉我您提高速度的建议。

我需要找到.git机器上的所有目录。但可以保证.git目录都位于以大写字母开头的顶级目录中。

答案1

在这里,您可以使用一个find表达式来完成此操作,甚至可以使用以下命令来避免-mindepth/ -maxdepthGNUisms:

find / ! -path / ! -path '/[[:upper:]]*' -prune -o -name .git -type d -print

更一般地说,您可以find通过以下方式可移植地链接命令:

find ... -exec sh -c '
  find "$@" ... -exec ... {\} ...' sh {} +

(此处展示如何{}为内部(第二个)查找插入 a 以避免它被外部(第一个)查找所拾取)。

或者使用最新版本的 GNU find(4.9.0 或更高版本):

find ... -print0 | find -files0-from - ...

答案2

由于第一个find仅搜索单个级别,因此您可以将其替换为简单的 shell 通配符模式: 。然后将其用作要搜索的/[[:upper:]]*位置:find

find /[[:upper:]]* -type d -name ".git" 2>/dev/null

相关内容