问题描述
我想查找位于某个目录中的所有 git 存储库,而不是其子目录,例如)来测试 -depth 更新 -depth 2 )未在。这可能是一个OSX扩展。不要使用它!
使用 -mindepth 2 -maxdepth 2 来代替,正如@ hek2mgl在。
h3> OSX特定的
当<$ $时,似乎OSX版本的 find 不必要地下降到比2级更深的目录使用c $ c> -depth 2 (但这是正确的行为,见下文)。
你可以告诉它不要在 -depth 2 之后立即加上 -prune 如果你把它放在别的地方,就会有任何影响):
find〜/ repo -depth 2 -prune -type d -name。 git
一些基准:
$ time(find。-depth 4 -prune -type d -name .git | wc -l)
20
real 0m0.064s
用户0m0.009s
sys 0m0.046s
已移动 -prune 在t他结束了,它突然需要很多时间才能运行:
$ time(find。 -depth 4 -type d -name .git -prune | wc -l)
20
real 0m12.726s
user 0m0.325s
sys 0m9.298s
备注
第二个想法是(仔细阅读 man找到) -depth 2 不需要 find 在超过两个的目录中停止递减水平。它可以是一个更复杂的条件的一部分,它需要 -depth 2 或别的东西(fe find。-depth 2 - 或者--name .git )。
要强制停止下降超过两个级别,您必须使用 -maxdepth 2 或 -depth 2 -prune 。
- -maxdepth 告诉它不要超过两层;
- -depth 2 -prune 告诉它会停止下降到子目录中,如果被检查的目录是两层深的。
它们有相同的行为,选择一个或另一个是优先事项。我会选择 -maxdepth 2 ,因为它更清晰。 结论 b $ b
因为 -depth 2 不可移植,所以最终的命令应该是这样的:
find〜/ repo -mindepth 2 -maxdepth 2 -type d -name'.git'-print
感谢@ hek2mgl提及兼容性问题。
I want to find all git repositories lying in some directory, but not its subdirectories, say ~/repo. Two simple approaches are
find ~/repo -depth 2 -type d -name '.git' | while read repo …
or
for repo in ~/repo/*/.git …
The version using find is magnitudes slower than the one with the globbing pattern. I am very surprised by this, because there is no real reason why one method would need more system calls than the other to gather its informations. I tried a smarter version of the find invocation
find ~/repo -depth 3 -prune -o -depth 2 -type d -name '.git' -print | while read repo …
without any noticeable improvement. Unfortunately I was not able to trace system calls to figure out how find is working here.
What explains the huge speed difference between these two methods? (The shell is /bin/sh which I believe to be some obsolete version of bash.)
Update: the test -depth with arguments (-depth 2) is not specified in the documentation of GNU find. It is probably an OSX extension. Don't use it!
Use -mindepth 2 -maxdepth 2 instead, as suggested by @hek2mgl in their answer.
OSX specific
It seems the OSX version of find unnecessarily descends into directories deeper than 2 levels when -depth 2 is used (but this is the correct behaviour, see below).
You can tell it to not do that by adding -prune immediately after -depth 2 (it seems it doesn't have any effect if you put it somewhere else):
find ~/repo -depth 2 -prune -type d -name .git
Some benchmarks:
$ time (find . -depth 4 -prune -type d -name .git | wc -l) 20 real 0m0.064s user 0m0.009s sys 0m0.046s
Moved -prune at the end and it suddenly needs a lot of time to run:
$ time (find . -depth 4 -type d -name .git -prune | wc -l) 20 real 0m12.726s user 0m0.325s sys 0m9.298s
Remarks
On a second thought (and after a closer reading of man find) -depth 2 does not require find to stop descending in directories deeper than two levels. It can be part of a more complex condition that requires -depth 2 or something else (f.e. find . -depth 2 -or -name .git).
To force it to stop descending more than two levels you must use either -maxdepth 2 or -depth 2 -prune.
- -maxdepth tells it to not go deeper than two levels;
- -depth 2 -prune tells it to stop descending into subdirectories if the directory under examination is two levels deep.
They have equivalent behaviour, choosing one or another is a matter of preference. I would choose -maxdepth 2 because it is more clear.
Conclusion
Because -depth 2 is not portable, the final command should be like:
find ~/repo -mindepth 2 -maxdepth 2 -type d -name '.git' -print
Thanks @hek2mgl for mentioning about the compatibility issue.
这篇关于如何加快寻找上市git存储库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!