¿Cómo puedo usar grep para mostrar solo nombres de archivos en Linux?

1068

¿Cómo puedo usar greppara mostrar solo nombres de archivos (sin coincidencias en línea) en Linux?

Normalmente estoy usando algo como:

find . -iname "*php" -exec grep -H myString {} \;

¿Cómo puedo obtener los nombres de archivo (con rutas), pero sin las coincidencias? ¿Tengo que usar xargs? No vi una manera de hacer esto en mi greppágina de manual.

cwd
fuente
3
¿Quieres decir que quieres los nombres de archivo que tienen al menos una coincidencia?
leonbloy
44
Gran pregunta De hecho, comencé a usar esto para abrir una lista de archivos devueltos por grep en Vim. vim $(grep -rl Something app/)
David Tuite
1
No puede enumerar archivos usando el comando grep, se usa básicamente para obtener el texto deseado de un archivo o una lista. Por ejemplo, ps aux | grep 'apt-get' o grep 'text-to-find' / path / to / file /
iamjayp

Respuestas:

1625

La opción estándar grep -l(que es una L minúscula) podría hacer esto.

Del estándar Unix :

-l
    (The letter ell.) Write only the names of files containing selected
    lines to standard output. Pathnames are written once per file searched.
    If the standard input is searched, a pathname of (standard input) will
    be written, in the POSIX locale. In other locales, standard input may be
    replaced by something more appropriate in those locales.

Tampoco es necesario -Hen este caso.

Aleatorio832
fuente
37
¡La documentación de esta opción es (como a menudo en la mayoría de los archivos man) tan poco clara! Pfff ... Increíble cómo el hombre puede ser un dolor en el culo.
MonsieurDart
1
-H también muestra los partidos ellos mismos. La pregunta era solo para nombres de archivo.
Hauke
@Hauke ​​Y mi respuesta fue -l. Mencioné -H solo porque el comando del usuario en la pregunta incluía -H y es redundante cuando se da -l.
Random832
2
Niza, que personalmente me gusta usar esto con otras banderas grep -nrl "some text" .en la búsqueda de texto en un conjunto de subcarpetas de forma recursiva
openwonk
142

Desde la grep(1)página del manual:

  -l, --files-with-matches
          Suppress  normal  output;  instead  print the name of each input
          file from which output would normally have  been  printed.   The
          scanning  will  stop  on  the  first match.  (-l is specified by
          POSIX.)
Ignacio Vazquez-Abrams
fuente
44
Pararse en el primer partido es necesario y natural.
Thomson
77
la documentación lo hace un poco confuso. "La exploración se detendrá en la primera coincidencia": indica que se imprimirán todos los nombres de archivo, pero la exploración de la palabra coincidente se detendrá en la primera aparición.
TheMonkWhoSoldHisCode
2
@VishalP: Dado que no nos importa dónde están las ocurrencias, solo si existen, no tiene sentido buscar en cada archivo más allá de la primera ocurrencia.
Ignacio Vazquez-Abrams
17
@ IgnacioVazquez-Abrams Exactamente. La primera impresión del documento le hace sentir que solo imprimirá el nombre del primer archivo. Realmente necesitas un par de lecturas para entenderlo.
TheMonkWhoSoldHisCode
55
'El escaneo del archivo actual se detendrá en el primer partido'. Sería mucho más claro.
sorrymissjackson
37

Para una simple búsqueda de archivos, puede usar grep -ly -ropciones:

grep -rl "mystring"

Toda la búsqueda se realiza por grep. Por supuesto, si necesita seleccionar archivos en algún otro parámetro, find es la solución correcta:

find . -iname "*.php" -execdir grep -l "mystring" {} +

La execdiropción crea cada comando grep por cada directorio y concatena los nombres de archivo en un solo comando ( +).

el hombre de hojalata
fuente
0

Su pregunta ¿Cómo puedo obtener los nombres de archivo (con rutas)

Su sintaxis ejemplo find. -iname "* php" -exec grep -H myString {} \;

Mi sugerencia de comando

sudo find /home -name *.php

El resultado de este comando en mi sistema operativo Linux:

compose-sample-3 / html / mail / contact_me.php

Como necesita el nombre del archivo con la ruta, ¡disfrute!

apl
fuente
La pregunta específicamente pregunta cómo obtienen los nombres de archivo usando grep .
snakecharmerb