Encontre apenas os primeiros arquivos correspondentes usando find?

17

Digamos que possa haver centenas de *.txtarquivos em um diretório. Eu só quero encontrar os três primeiros *.txtarquivos e sair do processo de pesquisa.

Como conseguir isso usando o findutilitário? Eu tive um rápido através de sua página de manual, parecia não ser uma opção para isso.

mitnk
fonte
3
Você pode usar find . -name '*.txt' -print -quitapenas mostrar a primeira partida e deixar findsair após a primeira partida. Não sei se é possível me adaptar ao caso "sair depois de encontrar n correspondências".
NN

Respostas:

22

Você pode canalizar a saída findatravés de head:

find . -name '*.txt' | head -n 3
Chris Card
fonte
2
Eu sabia disso, quero sair do processo de pesquisa depois de descobrir os três primeiros arquivos correspondentes. Pode haver uma enorme quantidade de arquivos correspondentes que não me importo.
Mitnk 19/03/2013
2
Eu acho que o comando find não se terminou uma vez cabeça imprimiu os primeiros 3 arquivos
Chris Cartão de
1
Sim, é estranho, mas você está certo.
Mitnk
19
Não é nada estranho - é como os pipes funcionam no UNIX. 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.
D_Bye
3
Para resumir, -n 3é compatível com POSIX e, portanto, provavelmente mais portátil.
L0b0 19/03/2013
4

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

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
Kamil Maciorowski
fonte