- 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.