Para ignorar os diretórios .git
e tudo abaixo deles, você precisa de um constructo como este
find . \( -name '.git' -prune \) -o \( -print {or whatever else you want to do} \)
Isso diz a find
que quando encontra um arquivo ou diretório chamado .git
é para podar sua árvore e não descer mais abaixo nesse caminho. Tudo o mais pode ser combinado - e processado - dentro da outra metade da condição ou .
(As barras invertidas nos parênteses as impedem de serem processadas pelo shell e, para esse exemplo simplista, são tecnicamente desnecessárias. Deixei-as explicando como e e ou constrói bind.)
Agora, considere sua preocupação com uma pasta chamada foo
:
e.g.
-name foo
would match/dir1/dir2/foo
but not/dir1/dir2/foo/dir3/dir4/some_file
Você está correto, mas acho que perdeu o corolário. Em algum momento, find
alcançará /dir1/dir2/foo
. O -name foo
corresponderá e então o -prune
será invocado. find
não pode alcançar abaixo de foo
sem primeiro ver foo
.
Consequentemente, /dir1/dir2/foo/dir3/dir4/some_file
nunca pode ser alcançado.
O resultado inicial da inspeção é que, de alguma forma, -name foo
corresponde a /dir1/dir2/foo/dir3/dir4/some_file
, mas, na verdade, corresponde a /dir1/dir2/foo
e abandonou qualquer inspeção adicional dessa árvore.
Em contraste com -name foo
, que corresponde a foo
apenas como o último componente de um caminho, -path foo
corresponderá apenas se foo
for um caminho completo. ( find * -path foo
pode corresponder a foo
no nível superior, mas find . -path foo
nunca pôde corresponder a ./foo
.)