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


Como puedo usar grep para mostrar solo nombres de archivo (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 grep página del hombre


748
2017-07-09 22:24


origen


Respuestas:


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

Desde el 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.

Usted tampoco necesita -H en este caso.


1128
2017-07-09 22:26



Desde el grep(1) página de hombre:

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

101
2017-07-09 22:26



Para una simple búsqueda de archivos, puede usar grep's -l y -r opciones:

grep -rl "mystring"

Toda la búsqueda está hecha 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" {} +

los execdir opción construye cada comando grep por cada directorio, y concatena nombres de archivo en un solo comando (+)


23
2017-09-08 17:23