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.)