Como faço para impedir que um achado entre em diretórios encontrados?

20

Eu estou querendo encontrar todos os diretórios com uma string específica para que eu possa fazer outra busca nos arquivos contidos.

Então, não quero perder tempo com ./my-search-term/dir/my-search-term etc

Como posso parar de recorrer quando encontrei o primeiro diretório my-search-term?

    
por Stephen 13.11.2011 / 22:46

2 respostas

14

A ação -prune faz com que find não seja redirecionado para o diretório. Você pode combiná-lo com outra ação, como -exec (a ordem de -prune e -exec não importa, contanto que -prune seja executado de qualquer maneira).

find . -name my-search-term -prune -exec find {} … \;

Observe que aninhar find dentro de um find -exec pode ser um pouco problemático: você não pode usar -exec no interior find , porque o terminador seria visto como um terminador pelo% externofind . Você pode contornar isso chamando um shell, mas cuidado com as citações.

find . -name my-search-term -prune -exec sh -c '
    find "$0" … -exec … {} +
' {} \;
    
por 14.11.2011 / 01:55
6

- soluções simples -

Se você quiser que find pule o conteúdo do diretório encontrado, mas continue pesquisando em outros diretórios, use -prune como @laebshade sugerido. O comando completo deve se parecer com

 find . -type d -name somename -prune -exec ...

Por outro lado, se você quiser que find pare de pesquisar e depois de encontrar o primeiro diretório correspondente, o que você está procurando é -quit (disponível desde a versão 4.2.3 de GNU find ). Este é um pouco mais complicado de usar, porque faz find sair imediatamente - então -quit deve ser colocado no final do comando:

find . -type d -name somename -exec ... -quit

Para que isso funcione como esperado, é necessário assegurar que -exec retorne verdadeiro (em outras palavras, um status zero ). Se você quiser que o status de saída de -exec seja ignorado, para que -quit sempre funcione, você precisa de um pequeno truque:

find . -type d -name somename \( -exec ... -o -true \) -quit

ou

find . -type d -name somename \( -exec ... -o -quit \)

ou

find . -type d -name somename \( -exec ... , -quit \) # a comma before -quit

- alguma explicação -

A coisa mais importante sobre como find funciona é que todas as ações ("testes") são tratadas como predicados lógicos interpretados da esquerda para a direita. Portanto, a última ação (por exemplo -quit ) será executada somente se a parte anterior inteira não retornar false . Por padrão, todos os testes são unidos com "AND" lógico, a opção -o altera a junção para "OR".

Um elemento complicado de -o é que find pode "otimizar" seu comando e não executar a parte -exec se você digitar apenas

find . -type d -name somename -exec ... -o -quit

Para lidar com isso, você pode forçar find a avaliar todos os predicados com "OR", colocando-os entre parênteses.

    
por 14.11.2011 / 01:15