可能な解決策
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