Encontre arquivos no linux e exclua diretórios específicos

14

Eu tenho uma descoberta parecida com esta:

rm -f crush-all.js
find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | while read line
do
   cat "$line" >> crush-all.js
   echo >> crush-all.js
done

Eu gostaria de adicionar para excluir um diretório chamado "test" na descoberta, mas não consigo descobrir como adicionar "-type d" de alguma forma. Como eu fiz isso?

Obrigado!

Asken
fonte

Respostas:

22

Você pode usar a -pathopção para encontrá-lo e combiná-lo com o -notoperador.

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

Observe duas coisas

  • -path deve vir como o primeiro argumento
  • o padrão corresponde a todo o nome do arquivo, portanto -path test, nunca corresponderá a nada

A propósito, não sei por que você está usando parênteses, isso não faz diferença. É usado apenas para precedência, para construções como ! \( -name '*bla*' -name '*foo*' \)(ou seja, não encontra coisas que possuem ambos blae foo).

Um refinamento adicional: não há necessidade de usar o loop bash, você pode simplesmente fazer

find . ... -exec cat {} \; -exec echo \;

onde ... são os outros argumentos para find.

janeiro
fonte
2
find / -path ./test -prune -o ...

Renomeie ./testpara caber no local do diretório de teste.

Charles Clavadetscher
fonte
2
Neste caso, não se esqueça adicionar ação -print (porque -print não é ação padrão) após a opção -o
Bill Zhao
1

Você pode tentar com grep como este (a pasta aqui é chamada test_folder):

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/path/to/test_folder/" | while read line

ou se sua descoberta retornar caminho relativo:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "./relative_path/to/test_folder/" | while read line

ou se você quiser todas as pastas com o mesmo nome, mas com caminho diferente

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/test_folder/" | while read line

Cumprimentos,

Antoine Rodriguez
fonte
1

Para expandir o que acho que @CharlesClavadetscherestava acontecendo com sua resposta. Se você omitir um caminho -not -path ... find, continuará descendo o caminho. Em vez disso, o uso -pruneimpedirá que desça ainda mais no caminho omitido, tornando-o mais rápido. Então você pode fazer algo como

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print

fonte
0

Eu uso "not wholename" quando estou apenas procurando por um arquivo. -name testa o nome do arquivo real, mas -wholename testa o caminho completo. Então, adicione um ignorar para teste à pergunta acima:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
andrew lorien
fonte