Peut-être que « cest un peu étrange – et peut-être quil existe dautres outils pour le faire mais bon ..
Jutilise la commande bash classique suivante pour trouver tous les fichiers contenant une chaîne:
find . -type f | xargs grep "something"
Jai un grand nombre de fichiers, sur plusieurs profondeurs . La première occurrence de « quelque chose » me suffit, mais find continue la recherche et prend beaucoup de temps pour terminer le reste des fichiers. Ce que je voudrais faire est quelque chose comme un « retour » de grep pour trouver afin que find pourrait arrêter la recherche dautres fichiers. Une telle chose est-elle possible?
Réponse
Gardez-le simplement dans le domaine de find:
find . -type f -exec grep "something" {} \; -quit
Voici comment cela fonctionne:
Le -exec
fonctionnera lorsque le -type f
sera vrai. Et parce que grep
renvoie 0
(succès / vrai) lorsque a une correspondance, la réponse -quit
sera déclenchée.
Réponse
find -type f | xargs grep e | head -1
fait exactement cela: lorsque le head
se termine, lélément central du tube est notifié par un » tube cassé « , se termine à son tour et informe le find
. Vous devriez voir un avis tel que
xargs: grep: terminated by signal 13
qui confirme cela.
Commentaires
- +1 pour lexplication et lalternative, bien que lautre réponse me semble plus élégante, car elle est plus autonome
Answer
Pour faire cela sans changer doutils: (Jadore xargs)
#!/bin/bash find . -type f | # xargs -n20 -P20: use 10 parallel processes to grep files in batches of 20 # grep -m1: show just on match per file # grep --line-buffered: multiple matches from independent grep processes # will not be interleaved xargs -P10 -n20 grep -m1 --line-buffered "$1" 2> >( # Error output (stderr) is redirected to this command. # We ignore this particular error, and send any others back to stderr. grep -v "^xargs: .*: terminated by signal 13$" >&2 ) | # Little known fact: all `head` does is send signal 13 after n lines. head -n 1
Commentaires
- +1 na jamais su que xargs aurait de telles capacités multitâches – merci aussi pour dautres commentaires! 🙂