¿Cómo devolver el nombre de archivo y el número de línea con find ... -exec grep?

45

Cuando lo uso find, ¿cómo devuelvo el nombre del archivo y el número de línea cuando busco una cadena? Me las arreglo para devolver el nombre del archivo en un comando y los números de línea con otro, pero parece que no puedo combinarlos.

Nombres de archivo: find . -type f -exec grep -l 'string to search' {} \;

Línea de números: find . -type f -exec grep -n 'string to search' {} \;

Danny_Joris
fuente

Respuestas:

51

El interruptor de línea de comando -Hobliga grepa imprimir el nombre del archivo, incluso con un solo archivo.

% 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.

Tenga en cuenta que, como dice Kojiro en un comentario , esto no es parte del estándar POSIX; está en GNU y BSD grep, pero es posible que algunos sistemas no lo tengan (por ejemplo, Solaris).

Kevin
fuente
44
Esta respuesta podría mejorarse señalando que el -Hindicador a grepes una extensión GNU no estándar y planteando un enfoque alternativo para sistemas no GNU.
kojiro
22
find . -type f -exec grep -n 'string to search' /dev/null {} +

(o con GNU grep, vea la -Hopción)

Stéphane Chazelas
fuente
Ambos + y -H funcionan muy bien, ¡gracias!
Danny_Joris
Y relacionado con esta respuesta: unix.stackexchange.com/questions/3682/…
Danny_Joris
44
+1 Correcto, porque causar grepque haya múltiples argumentos de nombre de archivo lo obligaría a generar los nombres de archivo coincidentes. ¡Inteligente!
kojiro
-1

Si su grep admite la -rbandera recursiva , esto resuelve su solicitud:

grep -rn "String to search " * 
Arrendajo
fuente
1
Eso es cierto, pero no veo lo que esto agrega a las respuestas existentes.
Comodín el
Y si solo hay un archivo (sin punto) en el directorio actual, este no muestra el nombre del archivo.
G-Man dice 'Reincorporar a Monica' el