可能的解决方案
对于GNU find和其他支持的实现-execdir:
find dir1 dir2 dir3 -type d -execdir test -d '.git' \; -print -prune
(请参阅评论)
先前讨论过的东西
如果以下修剪.git已足够,则解决方案
find dir1 dir2 dir3 -type d -path '*/.git' -print -prune | xargs -I {} dirname {}
如果-printf '%h'受支持(例如GNU的情况find),则不需要dirname:
find dir1 dir2 dir3 -type d -path '*/.git' -printf '%h\n' -prune
一旦遇到.git当前路径中的文件夹,它将输出该文件夹,然后停止在子树中向下查找。
如果.git找到一个文件夹后应修剪整个文件夹树的解决方案
使用-quit如果您的find支持它:
for d in dir1 dir2 dir3; do
find "$d" -type d -name .git -print -quit
done | xargs -I {} dirname {}
(根据StéphaneChazelas的详细帖子 -quit,GNU和FreeBSD find以及NetBSD中的支持-exit。)
再次与-printf '%h'如果支持:
for d in dir1 dir2 dir3; do
find "$d" -type d -name .git -printf '%h\n' -quit
done
与.git文件夹所在位置相同级别的修剪解决方案
有关此特定问题的当前解决方案,请参见“可能的解决方案”部分。
(哦,很显然,使用的解决方案xargs假定路径中没有换行符,否则您将需要空字节魔术。)
getpof .git是我用的 github.com/thrig/scripts/blob/master/filesys/getpof.c