Respostas:
Você pode canalizar a saída findatravés de head:
find . -name '*.txt' | head -n 3
headinicia e aguarda a entrada do lado esquerdo do tubo. Em seguida, findinicia e procura por arquivos que correspondam aos critérios especificados, enviando sua saída pelo canal. Quando headrecebe e imprime o número de linhas solicitadas, termina, fechando o tubo. findpercebe 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]:
headinicia e aguarda a entrada do lado esquerdo do tubo. Em seguida,findinicia e procura por arquivos que correspondam aos critérios especificados, enviando sua saída pelo canal. Quandoheadrecebe e imprime o número de linhas solicitadas, termina, fechando o tubo.findpercebe o tubo fechado e também termina. Simples, elegante e eficiente .
Isso é quase verdade.
O problema é findperceber o tubo fechado apenas quando ele tenta gravar nele - nesse caso é quando a quarta correspondência é encontrada. Mas se não houver quarta partida, findcontinuará. 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 findterminar 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 headsai, o shell continua imediatamente. O findprocesso em segundo plano pode ser ignorado (sairá mais cedo ou mais tarde) ou direcionado com pkillalgo assim.
Para provar o conceito que você pode procurar /. Esperamos apenas uma partida, mas a findprocuramos 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 -quitapenas mostrar a primeira partida e deixarfindsair após a primeira partida. Não sei se é possível me adaptar ao caso "sair depois de encontrar n correspondências".