Quiero encontrar todos los archivos que contengan una cadena de texto específica. El grep
el comando funciona, pero no se como usarlo para cada directorio (solo puedo hacerlo para mi directorio actual). Intenté leer man grep
, pero no dio ninguna ayuda.
Sería mejor usar
grep -rl "string" /path
donde
-
-r
(o--recursive
la opción ) se utiliza para recorrer también todos los subdirectorios de/path
, mientras -
-l
(o--files-with-matches
la opción ) se usa para imprimir solo los nombres de archivo de los archivos coincidentes, y no las líneas coincidentes (esto también podría mejorar la velocidad, dado quegrep
detenga la lectura de un archivo en la primera coincidencia con esta opción).
Si está buscando líneas que coincidan en archivos, mi comando favorito es:
grep -Hrn 'search term' path/to/files
-
-H
hace que se imprima el nombre de archivo (implícito cuando se buscan varios archivos) -
-r
realiza una búsqueda recursiva -
-n
hace que se imprima el número de línea
path/to/files
puede ser .
para buscar en el directorio actual
Otras opciones que me parecen muy útiles:
-
-I
ignorar archivos binarios (complemento:-a
tratar todos los archivos como texto) -
-F
tratarsearch term
como literal, no como expresión regular -
-i
realice una búsqueda que no distinga entre mayúsculas y minúsculas -
--color=always
para forzar colores incluso cuando se canaliza a través deless
. Hacerless
colores de soporte, necesita usar el-r
opcion:grep -Hrn search . | less -r
-
--exclude-dir=dir
útil para excluir directorios como.svn
y.git
.
Creo que puedes usar algo como esto:
find /path -type f -exec grep -l "string" {} \;
Explicación de los comentarios
find
es un comando que le permite encontrar archivos y otros objetos como directorios y enlaces en subdirectorios de una ruta determinada. Si no especifica una máscara que los nombres de archivo deben cumplir, enumera todos los objetos de directorio.
-
-type f
especifica que debe procesar solo archivos, no directorios, etc. -
-exec grep
especifica que para cada archivo encontrado, debe ejecutar el comando grep, pasándole su nombre de archivo como argumento, reemplazando{}
con el nombre de archivo
Mi comando predeterminado es
grep -Rin string *
Uso una 'R' en mayúsculas porque ls
lo usa para recursivo. Dado que grep acepta ambos, no hay razón para no usarlo.
EDITAR: por HVNSweeting, aparentemente -R
seguirá enlaces simbólicos donde as -r
no.
Si estás dispuesto a probar algo nuevo, regala ack
tiro. El comando para buscar recursivamente el directorio actual string
ser:
ack string
La instalación es bastante sencilla:
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(Siempre que ya tenga el directorio ~/bin
y está preferiblemente en tu PATH
.)
El comando rgrep está dedicado para tal necesidad
Si no está disponible, puede obtenerlo de esta manera
mkdir -p ~/bincd ~/binwget http://sdjf.esmartdesign.com/files/rgrepchmod +x rgrep
Puede establecer directamente en sus opciones grep predeterminadas como se describe anteriormente.
Yo personalmente uso
[[ ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"args="${args:--Hns} --color=auto"
tema relacionado : cómo usar siempre rgrep con color
Actualización 2:
Esta línea de comandos usa find
y grep
soluciona el problema:
$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +
--color=<always or auto>
para salida en color:
$ find path_to_search_in -type f \ -exec grep --color=always -in searchString {} 2>/dev/null +
Ejemplo:
$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +
Un ejemplo ejecutado en la instantánea a continuación:
Actualización 1:
Puede intentar el siguiente código; como una función en su .bashrc
o .bash_aliases
o en un guión:
wherein () { for i in $(find "$1" -type f 2> /dev/null); do if grep --color=auto -i "$2" "$i" 2> /dev/null; then echo -e "\033[0;32mFound in: $i \033[0m\n"; fi; done}
Uso: wherein /path/to/search/in/ searchkeyword
ejemplo:
$ wherein ~/Documents/ "hello world"
(Nota: Como se sugiere en los comentarios a continuación por @enzotib, esto no funciona con archivos / directorios que incluyen espacios en sus nombres.)
Post Original
Para buscar la cadena y generar solo esa línea con la cadena de búsqueda:
$ for i in $(find /path/of/target/directory -type f); do \ grep -i "the string to look for" "$i"; done
p. ej.:
$ for i in $(find /usr/share/applications -type f); \ do grep -i "web browser" "$i"; done
Para mostrar el nombre de archivo que contiene la cadena de búsqueda:
$ for i in $(find /path/of/target/directory -type f); do \ if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;
p. ej.:
$ for i in $(find /usr/share/applications -type f); \ do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \ fi; done;
grep
(GNU o BSD)
Puedes usar grep
herramienta para buscar recursivamente la carpeta actual con -r
parámetro, como:
grep -r "pattern" .
Nota: -r
- Búsqueda recursiva de subdirectorios.
Para buscar dentro de archivos específicos, puede usar un sintaxis de globbing como:
grep "class foo" **/*.c
Nota: Al usar opción de globbing (**
), escanea todos los archivos de forma recursiva con una extensión o patrón específico. Para habilitar esta sintaxis, ejecute: shopt -s globstar
. También puede utilizar **/*.*
para todos los archivos (excepto ocultos y sin extensión) o cualquier otro patrón.
Si tiene el error de que su argumento es demasiado largo, considere reducir su búsqueda o use find
sintaxis en su lugar, como:
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
Alternativamente, use ripgrep
.
ripgrep
Si está trabajando en proyectos más grandes o archivos grandes, debe usar ripgrep
en cambio, como:
rg "pattern" .
Consulte los documentos, los pasos de instalación o el código fuente en Página del proyecto GitHub.
Es mucho más rápido que cualquier otra herramienta como GNU/BSD grep
, ucg
, ag
, sift
, ack
, pt
o similar, ya que está construido sobre Motor de expresiones regulares de Rust que utiliza autómatas finitos, SIMD y optimizaciones literales agresivas para hacer que la búsqueda sea muy rápida.
Admite ignorar patrones especificados en .gitignore
archivos, por lo que una única ruta de archivo se puede comparar con varios patrones globales simultáneamente.
Puede utilizar los parámetros comunes, como:
-
-i
- Búsqueda insensible. -
-I
- Ignorar los archivos binarios. -
-w
- Búsqueda de palabras completas (en oposición a la coincidencia parcial de palabras). -
-n
- Muestra la línea de tu partido. -
-C
/--context
(p. ej.-C5
)- Aumenta el contexto, para que pueda ver el código circundante . -
--color=auto
- Marca el texto coincidente. -
-H
- Muestra el nombre del archivo donde se encuentra el texto. -
-c
- Muestra el recuento de líneas coincidentes. Se puede combinar con-H
.
Hago esto usando xargs, un comando muy subestimado
find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'
encontrar ./ le da una lista recursiva de todos los archivos en una carpeta actual, luego la canaliza a xargs que ejecuta el comando grep en cada uno de esos archivos
Sé que hay muchas respuestas aquí, pero aquí hay una alternativa si desea agregar otras restricciones al buscar en los archivos:
find . -type f -exec grep --quiet string_to_look_for {} ';' -print
Esto funciona porque grep
devolverá 0 si encontró un resultado, 1 en caso contrario. Por ejemplo, puede encontrar archivos de 1 MB de tamaño y conteniendo algo:
find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print
Para múltiples requisitos, es probable que desee utilizar el indicador optimizador -O
eso existe en GNU grep.
Comodín con --include="*.Opción C"
, @usuario311346, gracias a @Lekensteyn.
grep-RIn < yor pattern> * Buscará desde los directorios actuales hacia abajo en todos los archivos de texto.
No estoy seguro de cómo hacer mi búsqueda recursivamente en patrones de archivos como *.C con solo grep
Utilice la combinación find y grep para buscar de forma recursiva en archivos una cadena en los subdirectorios current y all. Compruebe esto http://wilddiary.com/find-files-containing-my-text/