可能な解決策
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現在のパスにあるフォルダーに出くわすと、それが出力され、サブツリーを見下ろすのをやめます。
a .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