Supposons qu'il puisse y avoir des centaines de *.txt
fichiers dans un répertoire. Je veux seulement trouver les trois premiers *.txt
fichiers, puis quitter le processus de recherche.
Comment y parvenir en utilisant l' find
utilitaire? J'ai eu un rapide survol sur sa page de manuel, ne semblait pas une telle option pour cela.
find . -name '*.txt' -print -quit
uniquement afficher la première correspondance et laisserfind
sortir après la première correspondance. Je ne sais pas s'il est possible de s'adapter au cas "sortie après avoir trouvé n correspondances".Réponses:
Vous pouvez diriger la sortie de
find
viahead
:la source
head
démarre et attend l'entrée du côté gauche du tuyau. Ensuitefind
démarre et recherche les fichiers qui correspondent aux critères spécifiés, envoyer sa sortie par le tuyau. Quandhead
a reçu et imprimé le nombre de lignes demandées, il se termine, fermant le tuyau.find
remarque le tuyau fermé et il se termine également. Simple, élégant et efficace.-n 3
est compatible POSIX , et donc susceptible d'être plus portable.Cette autre réponse est quelque peu imparfaite. La commande est
Ensuite, il y a une explication dans l'un des commentaires [c'est moi qui souligne]:
C'est presque vrai.
Le problème est que
find
le tube fermé n'est remarqué que lorsqu'il essaie d'y écrire - dans ce cas, c'est lorsque la 4e correspondance est trouvée. Mais s'il n'y a pas de 4e match,find
cela continuera. Votre coquille attendra! Si cela se produit dans un script, le script attendra, malgré le fait que nous savons déjà que la sortie du tube est finale et que rien ne peut y être ajouté. Pas si efficace.L'effet est négligeable si ce particulier se
find
termine rapidement par lui-même mais avec une recherche complexe dans une grande arborescence de fichiers, la commande peut retarder inutilement tout ce que vous voulez faire ensuite.La solution pas si parfaite est d'exécuter
De cette façon, à la
head
sortie, le shell continue immédiatement. Lefind
processus d' arrière-plan peut alors être ignoré (il se terminera tôt ou tard) ou ciblé avecpkill
ou quelque chose.Pour prouver le concept que vous pouvez rechercher
/
. Nous n'attendons qu'un seul match, mais nous le cherchonsfind
partout et cela peut prendre beaucoup de temps.Arrêtez-le avec Ctrl+ Cdès que vous voyez le problème. Comparez maintenant:
la source