Cómo usar el comando "grep" para encontrar texto que incluya subdirectorios

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 que grep 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 tratar search 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 de less. Hacer less colores de soporte, necesita usar el -r opcion:

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

Example output

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/