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 -path
a 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 -path
predicado antes do último valor da opção"./.cache"
O caminho usado com -path
deve 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 -maxdepth
são sempre colocados imediatamente após searchpath
. Os argumentos -path
devem corresponder ao que find
seria 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