Cómo usar el comando "grep" para buscar texto, incluidos los subdirectorios

289

Quiero encontrar todos los archivos que contienen una cadena de texto específica. El comando grep funciona, pero no sé cómo usarlo para cada directorio (solo puedo hacerlo para mi directorio actual). Intenté leer man grep , pero no obtuvo ninguna ayuda.

    
pregunta Smile.Hunter 01.08.2011 - 13:38

11 respuestas

373

Sería mejor usar

grep -rl "string" /path

donde

  • La opción -r (o --recursive ) se usa para recorrer también todos los subdirectorios de /path , mientras que
  • La opción -l (o --files-with-matches ) solo se usa para imprimir nombres de archivo de archivos coincidentes, y no las líneas coincidentes (esto también podría mejorar la velocidad, dado que grep deja de leer un archivo en la primera coincidencia con esta opción).
respondido por el enzotib 01.08.2011 - 13:55
136

Si busca líneas que coincidan en archivos, mi comando favorito es:

grep -Hrn 'search term' path/to/files
  • -H hace que se imprima el nombre del 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

Más opciones que me parecen muy útiles:

  • -I ignora los archivos binarios (complemento: -a trata todos los archivos como texto)
  • -F treat search term como literal, no una expresión regular
  • -i realiza una búsqueda insensible a mayúsculas y minúsculas
  • --color=always para forzar colores incluso cuando se canaliza a través de less . Para hacer que less apoye los colores, debe usar la opción -r :

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

    
respondido por el Lekensteyn 01.08.2011 - 14:27
21

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 buscar archivos y otros objetos como directorios y enlaces en subdirectorios de una ruta determinada. Si no especifica una máscara que los nombres de archivos 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, pasando su nombre de archivo como argumento, reemplazando {} con el nombre de archivo
respondido por el dmityugov 01.08.2011 - 13:48
17

Mi comando predeterminado es

grep -Rin string *

Utilizo una capital 'R' porque ls lo usa para recursivo. Dado que grep acepta ambos, no hay razón para no usarlo.

EDITAR: por HVNSweeting, aparentemente -R seguirá los enlaces simbólicos, ya que -r no.

    
respondido por el user606723 01.08.2011 - 16:43
11

Si está dispuesto a probar algo nuevo, dele una ack toma. El comando para buscar recursivamente en el directorio actual para string es:

ack string

La instalación es bastante simple:

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

(Siempre que ya tenga el directorio ~/bin y esté preferiblemente en su PATH .)

    
respondido por el Konrad Rudolph 01.08.2011 - 17:09
3

El comando rgrep está dedicado a tal necesidad

Si no está disponible, puede obtenerlo así

mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep

Puede establecer directamente en sus opciones de grep predeterminadas como se describió anteriormente.

Personalmente uso

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"

tema relacionado: cómo usar siempre rgrep con color

    
respondido por el mnono 02.01.2015 - 14:58
2

Actualización 2:

Esta línea de comandos que 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 de 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 se ejecuta en la instantánea a continuación:

Actualización 1:

Puedes intentar seguir el código; como una función en su .bashrc o .bash_aliases o en una secuencia de comandos:

wherein () 
{ 
    for i in $(find "" -type f 2> /dev/null);
    do
        if grep --color=auto -i "" "$i" 2> /dev/null; then
            echo -e "3[0;32mFound in: $i 3[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, incluidos espacios en sus nombres).

Publicación original

Para buscar la cadena y salir 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

por ejemplo:

$ 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;

por ejemplo:

$ for i in $(find /usr/share/applications -type f); \
    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
    fi; done;
    
respondido por el precise 25.01.2014 - 12:11
1

Lo hago usando xargs, un comando muy subestimado

find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'

find ./ le proporciona una lista recursiva de todos los archivos en una carpeta actual luego lo canaliza a xargs que ejecuta el comando grep en cada uno de esos archivos

    
respondido por el deadprogrammer 01.08.2011 - 17:30
0

Sé que hay muchas respuestas aquí, pero esta es una alternativa si desea agregar otras restricciones al buscar 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 grande y que contienen algo:

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

Para varios requisitos, probablemente desee utilizar el indicador del optimizador -O que existe en GNU grep.

    
respondido por el Ztyx 11.03.2015 - 14:56
0

Un script (find-in-code) para buscar en C, código CPP:

#!/bin/sh

find . \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" \) -type f -print0 | xargs -0 grep --color -n ""

Uso:

find-in-code "search string"
    
respondido por el nvd 11.06.2015 - 18:49
0

grep ( GNU o BSD )

Puede usar la herramienta grep para buscar recursivamente la carpeta actual con el parámetro -r , como:

grep -r "pattern" .

Nota: -r - Buscar recursivamente subdirectorios.

Para buscar dentro de archivos específicos, puede usar una sintaxis globbing , como:

grep "class foo" **/*.c

Nota: al usar la opción globbing ( ** ), escanea todos los archivos recursivamente con una extensión o patrón específico. Para habilitar esta sintaxis, ejecute: shopt -s globstar . También puede usar **/*.* para todos los archivos (excluyendo los ocultos y sin extensión) o cualquier otro patrón.

Si tiene el error de que su argumento es demasiado largo, considere restringir su búsqueda, o use% sintaxis find como:

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

También puede usar ripgrep .

ripgrep

Si está trabajando en proyectos más grandes o archivos grandes, debe usar ripgrep en su lugar, como:

rg "pattern" .

Verifique los documentos, los pasos de instalación o el código fuente en la 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 Rge's regex motor que utiliza autómatas finitos, SIMD y optimizaciones literales agresivas para realizar búsquedas muy rápido.

Admite patrones ignorados en .gitignore archivos, por lo que una sola ruta de archivo puede coincidir con varios patrones globales simultáneamente.

Puede usar los parámetros comunes tales como:

  • -i - Búsqueda insensible.
  • -I - Ignora los archivos binarios.
  • -w - Busca las palabras completas (a diferencia del emparejamiento parcial de palabras).
  • -n - Muestra la línea de tu partida.
  • -C / --context (por ejemplo, -C5 ) - Aumenta el contexto, por lo que puede ver el código que lo rodea.
  • --color=auto - Marque el texto correspondiente.
  • -H - Muestra el nombre del archivo donde se encuentra el texto.
  • -c - Muestra el recuento de líneas coincidentes. Se puede combinar con -H .
respondido por el kenorb 11.04.2018 - 13:21

Lea otras preguntas en las etiquetas