¿Cómo puedo usar grep para encontrar una palabra dentro de una carpeta?

542

En Windows, habría hecho una búsqueda para encontrar una palabra dentro de una carpeta. Del mismo modo, quiero saber si una palabra específica aparece dentro de un directorio que contiene muchos subdirectorios y archivos. Mis búsquedas de sintaxis grep muestran que debo especificar el nombre del archivo, es decir grep string filename.

Ahora, no sé el nombre del archivo, entonces, ¿qué debo hacer? Un amigo sugirió hacer grep -nr string, pero no sé qué significa esto y no obtuve resultados (no hay respuesta hasta que emito un ctrl + c).

kiki
fuente

Respuestas:

849
grep -nr 'yourString*' .

El punto al final busca en el directorio actual. Significado para cada parámetro:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (Encontraría MobileAppServlet.javao MobileAppServlet.classo MobileAppServlet.txt; 'MobileAppASer*.*'es otra forma de hacer lo mismo).

Para verificar más parámetros, use el comando man grep .

Manish Ranjan
fuente
14
¿De qué va el negocio *? O bien dará como resultado la expansión de comodines de shell (si hay nombres de archivo que coincidan con el patrón de comodines), o grep lo tomará como operador de repetición de 0 o más para el carácter anterior *.
usta
77
Ahora vamos a considerar dos posibilidades de grep -nr MobileAppSer* .1. Supongamos que tenemos 3 archivos en el directorio actual encaja con el MobileAppSer*patrón de comodines: nombre MobileAppServlet.java, MobileAppServlet.class, MobileAppServlet.txt. A continuación, grepse invoca como esto: grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .. Significa buscar el texto "MobileAppServlet.class" en los archivos MobileAppServlet.java, MobileAppServlet.txt y en otras partes del directorio actual, que seguramente no es lo que el usuario quiere aquí.
usta
77
2. En caso de que no haya archivos en el directorio actual que coincidan con el MobileAppSer*patrón comodín, greprecibirá el argumento MobileAppSer*tal cual y, por lo tanto, lo tomará como búsqueda de texto "MobileAppSe" seguido de 0 o más apariciones de "r", por lo que intente encontrar los textos "MobileAppSe", "MobileAppSer", "MobileAppSerr", "MobileAppSerrr", etc. en el contenido de los archivos del directorio actual, tampoco lo que el usuario desea.
usta
55
Esta es una dudosa elección de expresiones regulares. Usta lo ha señalado.
kindasimple
117
grep -nr string my_directory

Notas adicionales: esto satisface la sintaxis grep [options] string filenameporque en los sistemas tipo Unix, un directorio es un tipo de archivo (hay un término "archivo normal" para referirse específicamente a entidades que se llaman simplemente "archivos" en Windows).

grep -nr string lee el contenido para buscar desde la entrada estándar, es por eso que solo espera su entrada y deja de hacerlo cuando presiona ^ C (también se detendría en ^ D, que es la combinación de teclas para el final de -archivo).

usta
fuente
1
Hola, así que si quiero buscar una cadena independientemente del caso, debo hacer esto: grep -i -nr "mi palabra".
kiki el
2
@kiki: Sí, que es equivalente agrep -inr "my word" .
usta
16
@kiki: -rpara grep significa buscar en subdirectorios de forma recursiva y -nsignifica prefijar cada línea de salida con el número de línea correspondiente del archivo que contiene esa línea. man grepdescribe todo esto y mucho más.
usta
62

GREP : Impresión / analizador / procesador / programa de expresión regular global.
Puede usar esto para buscar en el directorio actual.
Puede especificar -R para "recursivo", lo que significa que el programa busca en todas las subcarpetas, sus subcarpetas y las subcarpetas de sus subcarpetas, etc.

grep -R "your word" .

-n imprimirá el número de línea, donde coincidió en el archivo.
-ibuscará mayúsculas y minúsculas (mayúsculas / no mayúsculas).

grep -inR "your regex pattern" .
Stefan Steiger
fuente
3
./* significa todos los archivos en el directorio actual, -R significa recursivo (buscando subdirectorios, etc.)
Stefan Steiger
25
grep -nr search_string search_dir

realizará una búsqueda RECURSIVA (es decir, el directorio y todos sus subdirectorios) para buscar la cadena de búsqueda. (según la respuesta correcta de usta).

La razón por la que no recibiste ninguna respuesta con la sugerencia de tu amigo de:

grep -nr string

es porque no se especificó ningún directorio. Si está en el directorio en el que desea realizar la búsqueda, debe hacer lo siguiente:

grep -nr string .

Es importante incluir el '.' carácter, ya que esto le dice a grep que busque ESTE directorio.

Nico Huysamen
fuente
Hola, ¿qué hago si tengo que buscar 2 palabras con un espacio en el medio? ¿Deberían especificarse las palabras entre comillas? es decir grep -nr "mi palabra".
kiki
24

También hay:

find directory_name -type f -print0 | xargs -0 grep -li word

pero eso podría ser demasiado para un principiante.

findes un walker / lister de propósito general, -type fsignifica "buscar archivos sin formato en lugar de directorios y canalizaciones con nombre y lo que tiene", -print0significa "imprimirlos en la salida estándar utilizando caracteres nulos como delimitadores". La salida de findse envía a xargs -0y que toma su entrada estándar en fragmentos (para evitar las limitaciones de longitud de la línea de comando) utilizando caracteres nulos como separador de registros (en lugar de la nueva línea estándar) y se aplica grep -li worda cada conjunto de archivos. En el grep, -lsignifica "enumerar los archivos que coinciden" y -isignifica "mayúsculas y minúsculas"; por lo general, puedes combinar opciones de un solo personaje para que veas con -limás frecuencia que -l -i.

Si no lo usa -print0y -0luego se encontrará con problemas con los nombres de archivo que contienen espacios, entonces usarlos es un buen hábito.

mu es demasiado corto
fuente
1
@mmmshuddup: Gracias. Me siento mal si no doy una explicación como parte de la respuesta, especialmente cuando trabajo con un principiante.
mu es demasiado corto el
1
Eso es lo que más aprecio en este sitio. ¡Es importante recordar que todos fuimos principiantes una vez y que no es fácil llegar al mundo de la tecnología!
Sí, Barry, el
¿Puedo excluir ciertos directorios? @muistooshort
Ferologics
@Ferologics Debería haber, verifique man finddesde la línea de comandos para ver qué opciones findadmite.
mu es demasiado corto el
8

¿Por qué no hacer una búsqueda recursiva para encontrar todas las instancias en subdirectorios?

grep -r 'text' *

Esto funciona como un encanto.

Paxwell
fuente
1
No es necesario citar una cadena de búsqueda sin caracteres especiales como espacios
Scott Stensland
5
  1. grep -r "yourstring" * Encontrará "yourstring" en cualquier archivo y carpeta

Ahora, si desea buscar dos cadenas diferentes al mismo tiempo, siempre puede usar la opción E y agregar palabras para la búsqueda. ejemplo después del descanso

  1. grep -rE "yourstring|yourotherstring|$" *buscará ubicaciones de listas donde yourstringo yourotherstringcoincide
Nwaoga
fuente
4

Otra opción que me gusta usar:

find folder_name -type f -exec grep your_text  {} \;

-type f te devuelve solo archivos y no carpetas

-exec y {} ejecuta el grep en los archivos que se encontraron en la búsqueda (la sintaxis exacta es "-exec command {}").

jfhfhf839
fuente
4
grep -R "string" /directory/

-R sigue también los enlaces simbólicos cuando -r no.

DimiDak
fuente
2

La respuesta que seleccionó está bien y funciona, pero no es la forma correcta de hacerlo, porque:

grep -nr yourString* .

Esto realmente busca la cadena "yourStrin"y "g"0 o muchas veces.

Entonces, la forma correcta de hacerlo es:

grep -nr \w*yourString\w* .

Este comando busca la cadena con cualquier carácter antes y después en la carpeta actual.

eLRuLL
fuente
2
sin embargo grep -nr yourString, también funciona, ya que busca lo desnudo yourStringen cualquier lugar de la línea (o al menos en mi sistema, OSX Lion)
theheadofabroom
1

Similar a la respuesta publicada por @eLRuLL, una forma más fácil de especificar una búsqueda que respete los límites de las palabras es usar la -wopción:

grep -wnr "yourString" .
Mike Slinn
fuente
En el indicador de cmd o en el terminal de Windows, no se reconoce el término grep
kouty
@kouty grep es un comando de Unix. itechtics.com/using-findstr-windows
Hugo M. Zuleta
1

Ejecute (terminal) el siguiente comando dentro del directorio. Verificará recursivamente dentro de los subdirectorios también.

grep -r 'your string goes here' * 
Iwantha
fuente
0

El siguiente ejemplo busca recursivamente your search stringen los archivos *.xmly *.jsubicados en algún lugar dentro de las carpetas path1, path2y path3.

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

Por lo tanto, puede buscar en un subconjunto de los archivos muchos directorios, simplemente proporcionando las rutas al final.

platillo
fuente
-4

No uses grep. Descarga Silver Searcher o ripgrep . Ambos son excepcionales y mucho más rápidos que grep o ack con toneladas de opciones.

AAAfarmclub
fuente
2
Estas pueden ser herramientas geniales, pero esto no responde cómo usaría estas herramientas para lograr lo que el OP está pidiendo.
jmathew