Existe-t-il un moyen de forcer la find
commande pour s'arrêter juste après avoir trouvé la première correspondance ?
Réponse acceptée :
Avec GNU ou FreeBSD find
, vous pouvez utiliser le -quit
prédicat :
find . ... -print -quit
Le find
de NetBSD équivalent :
find . ... -print -exit
Si tout ce que vous faites est d'imprimer le nom, et en supposant que les noms de fichiers ne contiennent pas de caractères de saut de ligne, vous pouvez faire :
find . ... -print | head -n 1
Cela n'empêchera pas find
après le premier match, mais éventuellement, en fonction du timing et de la mise en mémoire tampon lors du deuxième match ou (beaucoup) plus tard. Fondamentalement, find
se terminera par un SIGPIPE lorsqu'il essaiera de sortir quelque chose alors que head
est déjà parti car il a déjà lu et affiché la première ligne d'entrée.
Notez que tous les shells n'attendront pas cette find
commande après head
est revenu. Le shell Bourne et les implémentations AT&T de ksh
(lorsqu'il n'est pas interactif) et yash
(uniquement si ce pipeline est la dernière commande d'un script) ne le ferait pas, le laissant s'exécuter en arrière-plan. Si vous préférez voir ce comportement dans n'importe quel shell, vous pouvez toujours modifier ce qui précède en :
(find . ... -print &) | head -n 1
Si vous ne vous contentez pas d'imprimer les chemins des fichiers trouvés, vous pouvez essayer cette approche :
find . ... -exec sh -c 'printf "%sn" "$1"; kill "$PPID"' sh {} ;
(remplace printf
avec tout ce que vous feriez avec ce fichier).
Cela a pour effet secondaire de find
renvoyant un statut de sortie reflétant le fait qu'il a été tué.
En fait, en utilisant le signal SIGPIPE au lieu de SIGTERM (kill -s PIPE
au lieu de kill
) rendra certains shells plus silencieux à propos de cette mort (mais renverra toujours un statut de sortie non nul).