Búsqueda de texto recursivo con patrones grep y de archivo

46

Dado este ejemplo de estructura de carpetas:

/folder1/file1.txt
/folder1/file2.djd
/folder2/file3.txt
/folder2/file2.fha

¿Cómo hago una búsqueda recursiva de texto en todos los *.txtarchivos con grep"/"?

( "grep -r <pattern> *.txt"falla cuando se ejecuta desde "/", ya que no hay .txtarchivos en esa carpeta).

Anders Sandvig
fuente

Respuestas:

61

Mi versión de GNU Grep tiene un interruptor para esto:

grep -R --include='*.txt' $Pattern

Descrito de la siguiente manera:

--include=GLOB

Busque solo archivos cuyo nombre base coincida con GLOB (utilizando la coincidencia con comodines como se describe en --excluir).

Kyle Brandt
fuente
19

Si tiene una gran cantidad de archivos, sería útil incorporar xargs en el comando para evitar el error 'Lista de argumentos demasiado larga'.

find . -name '*.txt' -print | xargs grep <pattern>
marca
fuente
66
Si hay espacios en cualquiera de los nombres de archivo o directorio, use este formulario: find. -name '* .txt' -print0 | xargs -0 grep <patrón>
Jason Luther
2
Y, por supuesto, está el problema de los nombres de archivo que comienzan con -.
TJ Crowder
grepes más rápido de find.
Nabi KAZ
2

es posible que pueda hacer uso de su zsh's EXTENDED_GLOBopción ( docs )

grep <pattern> **/*.txt
Papa Noel
fuente
Solo si OP está usando zsh, pero no obstante es interesante.
Ley29
1

Puede echar un vistazo a ack en http://betterthangrep.com , que tiene facilidades para seleccionar archivos para buscar por tipo de archivo.

Andy Lester
fuente
0
find . -name '*.txt' -type f -exec grep <pattern> {} \;
innaM
fuente
es posible que desee usar "find. -name '* .txt' -type f -exec grep <pattern> {} +" para que se comporte de manera similar a la versión de Mark Robinson - funciona solo con GNU find, que yo sepa
serverhorror
0

La respuesta de Mannis bifurcaría un nuevo proceso grep para cada archivo de texto. Si tiene muchos archivos de texto allí, puede considerar grepping cada archivo primero y elegir los archivos .txt cuando se haga eso:

grep -r <pattern> * | grep \.txt:

Eso requiere más disco, pero podría ser más rápido de todos modos.

Comandante Keen
fuente
0

Es 2019 y no hay forma de que todavía use grep para la búsqueda recursiva de texto.

En mi humilde opinión, las respuestas de hoy deben incluir ripgrep :

rg <pattern> -ttxt
Papa Noel
fuente