可能的解决方案
对于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