Trova solo i primi file corrispondenti usando find?


17

Supponiamo che ci possano essere centinaia di *.txtfile in una directory. Voglio solo trovare i primi tre *.txtfile e quindi uscire dal processo di ricerca.

Come ottenere ciò utilizzando l' findutilità? Ho avuto una rapida occhiata sulla sua pagina man, non mi sembrava una tale opzione.


3
Puoi usare find . -name '*.txt' -print -quitsolo mostrare la prima partita e lasciare finduscire dopo la prima partita. Non so se sia possibile adattarsi al caso "esci dopo aver trovato n corrispondenze".
NN,

Risposte:


22

È possibile reindirizzare l'output di findattraverso head:

find . -name '*.txt' | head -n 3

2
Lo sapevo, voglio uscire dal processo di ricerca dopo aver scoperto i primi tre file corrispondenti. Non ci possono essere enormi quantità di file corrispondenti che non mi interessano.
mitnk

2
Penso che il comando find venga interrotto una volta che head ha stampato i primi 3 file
Chris Card

1
Sì, è strano, ma hai ragione.
mitnk

19
Non è affatto strano - è come funzionano le pipe in UNIX. headsi avvia e attende l'input dal lato sinistro del tubo. Quindi si findavvia e cerca i file che soddisfano i criteri specificati, inviandone l'output attraverso la pipe. Quando headha ricevuto e stampato il numero di righe richieste, termina chiudendo il tubo. findnota il tubo chiuso e termina anche. Semplice, elegante ed efficiente.
D_Bye

3
Riassumendo, -n 3è compatibile con POSIX e quindi probabilmente più portatile.
l0b0

4

Quest'altra risposta è in qualche modo imperfetta. Il comando è

find . -name '*.txt' | head -n 3

Quindi c'è una spiegazione in uno dei commenti [enfasi mia]:

headsi avvia e attende l'input dal lato sinistro del tubo. Quindi si findavvia e cerca i file che soddisfano i criteri specificati, inviandone l'output attraverso la pipe. Quando headha ricevuto e stampato il numero di righe richieste, termina chiudendo il tubo. findnota il tubo chiuso e termina anche. Semplice, elegante ed efficiente .

Questo è quasi vero.

Il problema è findnotare la pipe chiusa solo quando tenta di scrivere su di essa - in questo caso è quando viene trovata la 4a corrispondenza. Ma se non c'è la quarta partita, allora findcontinuerà. La tua shell aspetterà! Se accade in uno script, lo script attenderà, nonostante sappiamo già che l'output della pipe è definitivo e non è possibile aggiungere nulla. Non così efficiente.

L'effetto è trascurabile se questo particolare findfinisce velocemente da solo, ma con una ricerca complessa in un grande albero di file il comando potrebbe ritardare inutilmente qualsiasi cosa tu voglia fare dopo.

La soluzione non così perfetta è quella di correre

( find … & ) | head -n 3

In questo modo quando headesce, la shell continua immediatamente. Il findprocesso in background può quindi essere ignorato (uscirà prima o poi) o mirato pkillo qualcosa del genere.


Per dimostrare il concetto che potresti cercare /. Ci aspettiamo una sola partita, ma la cerchiamo findovunque e potrebbe richiedere molto tempo.

find / -wholename / 2>/dev/null | head -n 1

Terminalo con Ctrl+ Cnon appena vedi il problema. Ora confronta:

pidof find ; ( find / -wholename / 2>/dev/null & ) | head -n 1 ; pidof find
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.