Comment arrêter la command find après le premier match?

Existe-t-il un moyen de forcer la command find à s'arrêter juste après avoir trouvé le premier match?

    Avec la search GNU ou FreeBSD, vous pouvez utiliser le prédicat -quit :

     find . ... -print -quit 

    Le NetBSD find équivalent:

     find . ... -print -exit 

    Si vous ne faites qu'imprimer le nom et en supposant que les noms de files ne contiennent pas de caractères de nouvelle ligne, vous pouvez faire:

     find . ... -print | head -n 1 

    Cela n'arrêtera pas de find après le premier match, mais peut-être, en fonction du timing et de la mise en memory tampon lors du deuxième match ou (beaucoup) plus tard. Fondamentalement, la find se terminera par un SIGPIPE quand il essaiera de sortir quelque chose alors que la head est déjà partie parce qu'elle a déjà lu et affiché la première ligne d'input.

    Notez que tous les shells n'attendront pas cette command find après que la head soit revenue. Le shell Bourne et les implémentations AT & T de ksh (non interactif) et de yash (seulement si ce pipeline est la dernière command d'un script) ne le laisseraient pas fonctionner en arrière-plan. Si vous préférez voir ce comportement dans n'importe quel shell, vous pouvez toujours changer le ci-dessus pour:

     (find . ... -print &) | head -n 1 

    Si vous ne faites pas qu'imprimer les paths des files trouvés, vous pouvez essayer cette approche:

     find . ... -exec sh -c 'printf "%s\n" "$1"; kill "$PPID"' sh {} \; 

    (remplacez printf par ce que vous feriez avec ce file).

    Cela a pour effet secondaire de find un statut de sortie reflétant le fait qu'il a été tué cependant.

    En fait, utiliser le signal SIGPIPE au lieu de SIGTERM ( kill -s PIPE au lieu de kill ) fera en sorte que certains shells seront plus silencieux au sujet de cette mort (mais returnneront toujours un état de sortie différent de zéro).

     find . -name something -print -quit 

    Termine la search après la première correspondance après l'avoir imprimée.

    Terminer la search après une quantité spécifique de correspondances et imprimer les résultats:

     find . -name something -print | head -n 5 

    Étonnamment assez – la tête se termine maintenant la string après 5 matchs, mais je ne sais pas comment ou pourquoi.

    C'est très facile à tester. Il suffit de find la search à la racine qui donnerait des milliers, peut-être encore plus de matchs tout en prenant au less une minute ou plus. Mais quand la "tête" "find" se termine après la quantité spécifiée de lignes définie dans la tête (la tête par défaut montre 10, utilisez "head -n" pour spécifier les lignes).

    Notez que cela se terminera après que "head -n" atteigne le nombre de caractères de nouvelle ligne spécifié et donc toute correspondance qui contient plusieurs caractères de nouvelle ligne countra en conséquence.

    À des fins de divertissement, voici un générateur de search paresseux à Bash. Cet exemple génère un anneau sur les files du directory en cours. Lisez autant que vous voulez, puis kill %+ (peut-être juste 1)

     #!/usr/bin/env bash unset -v files n trap 'kill "$x_PID"' EXIT coproc x while :; do find . -type f -maxdepth 1 -exec sh -c "$(</dev/fd/3)" _ {} + done 4<&0 <<\EOF 3<&0 <&4- for x; do read -r _ printf '%s\0' "$x" done EOF while echo >&${x[1]} IFS= read -rd '' -u "$x" 'files[n++]' do printf '%q ' "${files[@]}" echo sleep .2 done