Estou querendo encontrar todos os diretórios com uma sequência específica para que eu possa encontrar outra vez os arquivos contidos nele.
Então eu não quero perder tempo com ./my-search-term/dir/my-search-term
etc.
Como posso parar de repetir quando encontrei o primeiro diretório de termos de pesquisa?
Respostas:
A
-prune
açãofind
não recursa no diretório Você pode combiná-lo com outra ação, como-exec
(a ordem-prune
e-exec
não importa, desde que-prune
seja executada de qualquer maneira).Observe que aninhar
find
dentro de umfind -exec
pode ser um pouco problemático: você não pode usar-exec
no interiorfind
, porque o terminador seria visto como um terminador pelo externofind
. Você pode contornar isso invocando um shell, mas cuidado com a citação.fonte
-prune
retorna true e pode ser colocado antes do-exec
.-o
lá dentro, eu acho. E acho que colocar-prune
antes-exec
é mais legível.-prune
opção antes.mkdir -p x1 x2; touch x1/x11 x1/x12 x2/x21 x2/x22; find . -name 'x1*' -exec rm -rf {} \;
dá o erro:find: ./x1: No such file or directory
. A solução é adicionar-prune
no final dofind
comando.find
expandem{}
mesmo quando aparecem como uma substring de um argumento para-exec
. Essa versão dofind
sufocará em seu segundo comando, porque o comando{}
internofind
(no comando shell) será substituído pelo nome do diretório encontrado no externofind
. Você pode corrigir isso dizendofind . -name my-search-term -prune -exec sh -c 'find "$0" … -exec … "{"} +' {} \;
, ou seja, usando"{"}
, no qual o shell se transformará{}
. ... (continua)- soluções simples -
Se você quiser
find
pular o conteúdo do diretório encontrado, mas continuar pesquisando em outros diretórios, use-prune
como @laebshade sugerido. O comando completo deve se parecer comPor outro lado, se você deseja interromper
find
completamente a pesquisa e depois de encontrar o primeiro diretório correspondente, o que você está procurando é-quit
(disponível desde a versão4.2.3
doGNU find
). Este é um pouco mais complicado de usar, porquefind
sai imediatamente - portanto-quit
deve ser colocado no final do comando:Para que isso funcione conforme o esperado, é preciso garantir que os
-exec
retornos sejam verdadeiros (em outras palavras, um status zero ). Se você deseja que o status de saída-exec
seja ignorado, para que-quit
sempre funcione, é necessário um pequeno truque:ou
ou
- alguma explicação -
O 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
) só será executada se a parte anterior inteira não retornar falsa . Por padrão, todos os testes são associados ao lógico "AND", a-o
opção altera a junção para "OR".Um elemento complicado
-o
é que vocêfind
pode "otimizar" seu comando e não executar a-exec
parte se você digitar apenasPara lidar com isso, você pode forçar
find
a avaliar todos os predicados com "OR", colocando-os entre parênteses.fonte