Esta pergunta já tem respostas aqui :
Comentários
Resposta
É para isso que serve a opção -prune
:
find . -type d -name "avoid_this_directory_please" -prune -o -type f -print
Basicamente, diz “se houver” um diretório chamado avoid_this_directory_please
, não digite, caso contrário, se for “um arquivo normal, imprima seu nome de caminho”.
Comentários
- eu ia escrever a mesma coisa, um pouco diferente, como
find . \( -type d -name 'avoid_this_directory_please' -prune \) -o \( -type f -print \)
, mas gosto mais da sua sintaxe. Obrigado. - @TimKennedy Você provavelmente precisaria dos parênteses se quisesse
find . -type d \( -name "A" -o -name "B" \) -prune -o -type f -print
. - bom argumento. eu não ' nem sei quando / onde aprendi a fazer isso com os parênteses. essa idade se perde nas brumas do tempo. 🙂
- Isso, é claro, removerá quaisquer diretórios chamados
avoid_this_directory_please
em qualquer lugar da árvore, não apenas nos de nível superior.-path
permitiria mais controle nisso, como a página do manual ( citado abaixo por Xen2050) estados. - Eu não sabia que
-prune
considerava tudo após o primeirofind
argumento, incluindo-type
e ficou intrigado por não conseguir remover diretórios comfind / -type f -path /proc -prune -o -name foo -print
. Ver-type d
e-type f
no mesmo comando foi o que o fez clicar para mim. Agora, finalmente, sinto-me seguro para usarfind
, obrigado.
Resposta
Para evitar um diretório, tente o teste -path:
find . -type f ! -path "*/avoid_this_directory_please/*"
Comentários
- Observe que embora evite que arquivos dentro de
avoid_this_directory_please
sejam selecionados (a menos que seu caminho contenha caracteres inválidos), não impediráfind
de descer lá . Esse ' é o motivo pelo qual-prune
é melhor aqui. - Isso é muuuuito melhor do que usar
prune
. Eu sempre tenho que ler por meia hora para descobrir especificando o que eu não ' desejo para encontrar e, em seguida, emparelhar com a lógica OR para obter os arquivos que desejo. - @Merlin Depende obviamente do que você deseja alcançar. Com
-prune
,find
ganhou ' nem mesmo olhou nos caminhos selecionados, enquanto com! -path
, ainda assim inseriria o caminho e examinaria tudo.
Resposta
De man find
, na seção -path
, aparentemente combinando as outras 2 respostas
To ignore a whole directory tree, use -prune rather than checking every file in the tree. For example, to skip the directory `src/emacs" and all files and directories under it, and print the names of the other files found, do something like this: find . -path ./src/emacs -prune -o -print
Resposta
Experimente
find -name "*.js" -not -path "./directory/*"
Comentários
- Isso funciona se você estiver procurando apenas um tipo de extensão. O seguinte falhará:
find -name "*.js" -o -name "*.css" -not -path "./directory/*"
-prune
: pode ser um pouco confuso. Além disso, isso no stackoverflow descreve por que ' é tão chato de se usar.