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.
Respuestas
¿Demasiados anuncios?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 quegrep
detener la lectura de un archivo en el primer partido con esta opción).
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
tratamientosearch 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 laless
. Para hacerless
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
.
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
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
.)