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).

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).


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>

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

Solo si OP está usando zsh, pero no obstante es interesante.
Ley29


0
find . -name '*.txt' -type f -exec grep <pattern> {} \;

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.