我想要:
- 查找所有以大写字母开头的目录
- 然后,在这些目录中找到所有名为“.git”的目录
这是为了性能优化。我的解决方案是首先将搜索范围缩小到特定目录,然后在其中搜索。
对于第一个,我的想法是:
find / -mindepth 1 -maxdepth 1 -name "[[:upper:]]*"
对于第二个,我使用的是:
find / -type d -name ".git" 2>/dev/null
现在我不知道如何将它们链接在一起。我希望第二个find
只搜索第一个的结果find
。
或者,如果是 XY 问题,请告诉我您提高速度的建议。
我需要找到.git
机器上的所有目录。但可以保证.git
目录都位于以大写字母开头的顶级目录中。
答案1
在这里,您可以使用一个find
表达式来完成此操作,甚至可以使用以下命令来避免-mindepth
/ -maxdepth
GNUisms:
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