Lorsque vous utilisez find, comment renvoyer le nom de fichier et le numéro de ligne lors de la recherche dune chaîne? Je parviens à renvoyer le nom du fichier dans une commande et les numéros de ligne avec une autre, mais je ne parviens pas à les combiner.

Noms de fichier: find . -type f -exec grep -l "string to search" {} \;

Numéros de ligne: find . -type f -exec grep -n "string to search" {} \;

Réponse

Le le commutateur de ligne de commande -H force grep à imprimer le nom du fichier, même avec un seul fichier.

% grep -n 7 test.in 7:7 % grep -Hn 7 test.in test.in:7:7 

 -H, --with-filename Print the filename for each match. 

Notez que comme Kojiro le dit dans un commentaire , cela ne fait pas partie du standard POSIX, il est à la fois en grep GNU et BSD, mais il est possible que certains systèmes ne laient pas (par exemple Solaris).

Commentaires

  • Cette réponse pourrait être améliorée en signalant que le drapeau -H à grep est une extension GNU non standard et représente une approche alternative pour les systèmes non GNU.

Réponse

find . -type f -exec grep -n "string to search" /dev/null {} + 

(ou avec GNU grep, voir le -H option)

Commentaires

  • + et -H fonctionnent très bien, merci!
  • Et lié à cette réponse: unix.stackexchange.com/questions/3682/…
  • +1 Exact, parce que faire en sorte que grep ait plusieurs arguments de nom de fichier le forcerait à afficher les noms de fichiers correspondants. Astucieux!

Réponse

Si votre grep prend en charge le -r drapeau, ceci résout votre demande:

grep -rn "String to search " * 

Commentaires

  • Que ' est vrai, mais je ne ' voir ce que cela ajoute aux réponses existantes.
  • Et sil ny en a quune (sans point ) dans le répertoire courant, cela naffiche pas le nom du fichier.

Laisser un commentaire

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