409 votos

Cómo utilizar "grep" comando para buscar texto incluyendo subdirectorios

Quiero encontrar todos los archivos que contengan una determinada cadena de texto. El grep comando funciona, pero no sé cómo usarlo para cada directorio (sólo puedo hacerlo por mi directorio actual). Traté de lectura man grep, pero no ofrecen ninguna ayuda.

545voto

enzotib Puntos 38044

Sería mejor utilizar

grep -rl "string" /path

donde

  • -r (o --recursive) se utiliza la opción de recorrer también a todos los sub-directorios de /path, mientras que
  • -l (o --files-with-matches) se utiliza la opción de imprimir los nombres de archivo de los archivos coincidentes, y no las líneas coincidentes (esto también podría mejorar la velocidad, dado que grep detener la lectura de un archivo en el primer partido con esta opción).

181voto

tidbeck Puntos 281

Si usted está buscando para las líneas de concordancia en los archivos, mi favorito de comandos es:

grep -Hrn 'search term' path/to/files
  • -H hace que el nombre de archivo para imprimir (implícita, cuando varios archivos que se busca)
  • -r hace una búsqueda recursiva
  • -n hace que el número de línea para ser impreso

path/to/files puede . buscar en el directorio actual

Otras opciones que me parece muy útil:

  • -I ignorar los archivos binarios (complemento: -a el tratamiento de todos los archivos como texto)
  • -F tratamiento search term como un literal, no una expresión regular
  • -i hacer un insensible a mayúsculas-de búsqueda
  • --color=always a la fuerza de los colores, incluso cuando la tubería a través de la less. Para hacer less de apoyo de colores, usted necesita usar el -r opción de:

    grep -Hrn search . | less -r
    
  • --exclude-dir=dir útiles para excluir directorios como .svn y .git.

Example output

25voto

Sam Puntos 874

Yo creo que se puede usar algo como esto:

find /path -type f -exec grep -l "string" {} \;

Explicación de los comentarios

find es un comando que te permite buscar archivos y otros objetos como los directorios y enlaces en los subdirectorios de la ruta dada. Si no especifica una máscara que filesnames debe cumplir, enumera todos los objetos de directorio.

  • -type f especifica que se deben procesar sólo los archivos, no directorios, etc.
  • -exec grep especifica que para cada archivo encontrado, se debe ejecutar el comando grep, pasando por su nombre de archivo como argumento para que, mediante la sustitución de {} con el nombre de archivo

21voto

The Thunder Chimp Puntos 123

Mi comando predeterminado es

grep -Rin string *

Yo uso un capitolio 'R' porque ls lo utiliza para recursiva. Desde grep acepta tanto, no hay razón para no usarlo.

EDIT: por HVNSweeting, al parecer, -R va a seguir enlaces simbólicos donde como -r no.

13voto

The_cobra666 Puntos 95

Si usted está dispuesto a probar algo nuevo, dar ack de un tiro. El comando buscar de forma recursiva en el directorio actual de string está:

ack string

La instalación es bastante simple:

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

(Siempre que ya tenemos el directorio ~/bin y preferentemente en su PATH.)

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: