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! 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *