Comment retourner le nom du fichier et le numéro de ligne avec find… -exec grep?

45

Lors de l'utilisation find, comment renvoyer le nom du fichier et le numéro de ligne lors de la recherche d'une 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 fichiers: find . -type f -exec grep -l 'string to search' {} \;

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

Danny_Joris
la source

Réponses:

51

Le commutateur de ligne de commande -Hoblige 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 dans GNU et BSD grep, mais il est possible que certains systèmes ne l’aient pas (par exemple, Solaris).

Kevin
la source
4
Cette réponse pourrait être améliorée en signalant que le -Hdrapeau grepest une extension GNU non standard et en proposant une approche alternative pour les systèmes non GNU.
Kojiro
22
find . -type f -exec grep -n 'string to search' /dev/null {} +

(ou avec GNU grep, voir l' -Hoption)

Stéphane Chazelas
la source
les deux + et -H fonctionnent très bien, merci!
Danny_Joris
Et en relation avec cette réponse: unix.stackexchange.com/questions/3682/…
Danny_Joris
4
+1 Droite, car le fait grepd'avoir plusieurs arguments de nom de fichier l'obligerait à afficher les noms de fichiers correspondants. Intelligent!
kojiro
-1

Si votre grep supporte l' -rindicateur récursif , cela résout votre demande:

grep -rn "String to search " * 
Geai
la source
1
C'est vrai, mais je ne vois pas ce que cela ajoute aux réponses existantes.
Wildcard
Et s'il n'y a qu'un seul fichier (non point) dans le répertoire en cours, cela n'affiche pas le nom du fichier.
G-Man dit 'Réintégrez Monica'