Respostas:
Você pode canalizar a saída find
através de head
:
find . -name '*.txt' | head -n 3
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. Quando head
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 é
find . -name '*.txt' | head -n 3
Depois, há uma explicação em um dos comentários [ênfase minha]:
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 .
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
( find … & ) | head -n 3
Dessa maneira, quando head
sai, o shell continua imediatamente. O find
processo em segundo plano pode ser ignorado (sairá mais cedo ou mais tarde) ou direcionado com pkill
algo assim.
Para provar o conceito que você pode procurar /
. Esperamos apenas uma partida, mas a find
procuramos em todos os lugares e pode levar muito tempo.
find / -wholename / 2>/dev/null | head -n 1
Encerre-o com Ctrl+ Cassim que vir o problema. Agora compare:
pidof find ; ( find / -wholename / 2>/dev/null & ) | head -n 1 ; pidof find
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".