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.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.