Solução possível
Para o% GNUfind
e outras implementações que suportam -execdir
:
find dir1 dir2 dir3 -type d -execdir test -d '.git' \; -print -prune
(veja os comentários)
Material previamente discutido
Solução se a remoção abaixo de .git
for suficiente
find dir1 dir2 dir3 -type d -path '*/.git' -print -prune | xargs -I {} dirname {}
Se -printf '%h'
for suportado (como no caso do find
do GNU), não precisamos de dirname
:
find dir1 dir2 dir3 -type d -path '*/.git' -printf '%h\n' -prune
Quando encontrar uma pasta .git
no caminho atual, ela será impressa e, em seguida, parará de procurar mais abaixo na subárvore.
Solução se toda a árvore de pastas for removida quando for encontrado .git
Usando -quit
se o seu find
for compatível:
for d in dir1 dir2 dir3; do
find "$d" -type d -name .git -print -quit
done | xargs -I {} dirname {}
(De acordo com esta postagem detalhada de Stéphane Chazelas -quit
é suportada no GNU's e no find
do FreeBSD e no NetBSD como -exit
.)
Novamente com -printf '%h'
, se suportado:
for d in dir1 dir2 dir3; do
find "$d" -type d -name .git -printf '%h\n' -quit
done
Solução para remoção no mesmo nível de onde a pasta .git
é
Consulte a parte "Solução possível" para a solução atual para esse problema específico.
(Ah e obviamente as soluções usando xargs
assumem que não há novas linhas nos caminhos, caso contrário você precisaria de magia de byte nulo.)