Como excluir diretórios corretamente no find?

Como excluir diretórios corretamente no find?

De acordo com esta pergunta:Como excluir diretórios no find, o comando deve ser este:

find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print

Mas se eu fizer

find . -type d \( -path "./.cpan" -o -path "./.mozilla" -o "./.cache" \) -prune -o -print

Isso dá: find: paths must precede expression: ./.cache'

find: possible unquoted pattern after predicate -o'?

mas fiz citações.

Além disso, após -patha opção, o caminho deve ser absoluto ou relativo? Porque incluí o diretório atual ./[somefile], mas ele é necessário -path?

Responder1

Você perdeu o -pathpredicado antes do último valor da opção"./.cache"

O caminho usado com -pathdeve começar com o caminho de pesquisa de nível superior usado por find. Por exemplo

  • find . -path './something/here'
  • find /etc -path '/etc/init.d'

Talvez seja necessário usar o *curinga se quiser corresponder a um nome de diretório sem especificar sua posição na árvore do sistema de arquivos. Este exemplo irá corresponder a todos os arquivos ( -type f) em algum lugar do diretóriowizard

  • find . -path '*/wizard/* -type f -print

Responder2

Para futuros leitores, as soluções compatíveis com POSIX quenão percorra os diretórios excluídos e não os inclua na saídatêm os formatos gerais:

Exclusão única

find searchpath \! \( -path searchpath/excludepath -prune \)

Múltiplas exclusões

find searchpath \! \( \( -path searchpath/excludepath1 -o -path searchpath/excludepath2 -o -path 'searchpath/excludepathprefix-*' \) -prune \)

Impedir essa travessia pode fazer com queenormemelhoria no desempenho quando esses diretórios contêm muitos arquivos. A omissão completa dos diretórios excluídos da saída evita a operação acidental neles.

Outros filtros e parâmetros de saída podem ser colocadosdepoistodos os mostrados, exceto aqueles que -maxdepthsão sempre colocados imediatamente após searchpath. Os argumentos -pathdevem corresponder ao que findseria gerado para esse diretório e os curingas devem ser escapados/entre aspas.


Para esta questão, a solução seria esta (já que -printé o padrão):

find . \! \( \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -prune \)

Responder3

Chego a esta página quando procuro informações para fazer com que o comando find exclua vários diretórios. Eu encontro a resposta deWalfao mais elegante. Do meu experimento, uma variação baseada no mesmo conceito é:

find . \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -not -prune -o -print

informação relacionada