Digamos que possa haver centenas de *.txt
arquivos em um diretório. Eu só quero encontrar os três primeiros *.txt
arquivos e sair do processo de pesquisa.
Como conseguir isso usando o find
utilitário? Eu tive um rápido através de sua página de manual, parecia não ser uma opção para isso.
find . -name '*.txt' -print -quit
apenas mostrar a primeira partida e deixarfind
sair após a primeira partida. Não sei se é possível me adaptar ao caso "sair depois de encontrar n correspondências".Respostas:
Você pode canalizar a saída
find
através dehead
:fonte
head
inicia e aguarda a entrada do lado esquerdo do tubo. Em seguida,find
inicia e procura por arquivos que correspondam aos critérios especificados, enviando sua saída pelo canal. Quandohead
recebe e imprime o número de linhas solicitadas, termina, fechando o tubo.find
percebe o tubo fechado e também termina. Simples, elegante e eficiente.-n 3
é compatível com POSIX e, portanto, provavelmente mais portátil.Essa outra resposta é um tanto falha. O comando é
Depois, há uma explicação em um dos comentários [ênfase minha]:
Isso é quase verdade.
O problema é
find
perceber o tubo fechado apenas quando ele tenta gravar nele - nesse caso é quando a quarta correspondência é encontrada. Mas se não houver quarta partida,find
continuará. Sua concha vai esperar! Se isso acontecer em um script, o script aguardará, apesar de já sabermos que a saída do pipe é final e nada pode ser adicionado a ele. Não é tão eficiente.O efeito é insignificante se isso
find
terminar rapidamente por si só, mas com uma pesquisa complexa em uma grande árvore de arquivos, o comando pode atrasar desnecessariamente o que você deseja fazer em seguida.A solução não tão perfeita é executar
Dessa maneira, quando
head
sai, o shell continua imediatamente. Ofind
processo em segundo plano pode ser ignorado (sairá mais cedo ou mais tarde) ou direcionado compkill
algo assim.Para provar o conceito que você pode procurar
/
. Esperamos apenas uma partida, mas afind
procuramos em todos os lugares e pode levar muito tempo.Encerre-o com Ctrl+ Cassim que vir o problema. Agora compare:
fonte