Pesquisa de texto recursiva com padrões grep e de arquivo

46

Dado este exemplo de estrutura de pastas:

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

Como faço uma pesquisa de texto recursiva em todos os *.txtarquivos com grep"/"?

( "grep -r <pattern> *.txt"falha ao executar a partir de "/", pois não há .txtarquivos nessa pasta.)

Anders Sandvig
fonte

Respostas:

61

Minha versão do GNU Grep tem uma opção para isso:

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

Descrito da seguinte forma:

--include=GLOB

Pesquise apenas arquivos cujo nome base corresponda ao GLOB (usando a correspondência curinga, conforme descrito em --exclude).

Kyle Brandt
fonte
19

Se você tiver um grande número de arquivos, seria útil incorporar xargs no comando para evitar um erro 'Lista de argumentos muito longa'.

find . -name '*.txt' -print | xargs grep <pattern>
Marca
fonte
6
Se houver espaços em qualquer um dos nomes de arquivo ou diretório, use este formulário: find. -name '* .txt' -print0 | xargs -0 grep <padrão>
Jason Luther
2
E, claro, há a questão dos nomes de arquivos que começam com -.
TJ Crowder
grepé mais rápido find.
Nabi KAZ
2

você pode ser capaz de fazer uso de seu zsh's EXTENDED_GLOBopção ( docs )

grep <pattern> **/*.txt
santa
fonte
Somente se OP estiver usando zsh, mas interessante, no entanto.
Law29
1

Você pode dar uma olhada no ack em http://betterthangrep.com , que possui recursos para selecionar arquivos a serem pesquisados ​​por tipo de arquivo.

Andy Lester
fonte
0
find . -name '*.txt' -type f -exec grep <pattern> {} \;
innaM
fonte
você pode querer usar "find. -name '* .txt' -type f -exec grep <padrão> {} +" para que ele se comporte de maneira semelhante à versão de Mark Robinson - funciona apenas com o GNU
serverhorror
0

A resposta do Mannis criaria um novo processo grep para cada arquivo de texto. Se você tiver muitos arquivos de texto por lá, considere grepping todos os arquivos primeiro e escolha os arquivos .txt quando terminar:

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

Isso exige mais disco, mas pode ser mais rápido de qualquer maneira.

Comandante Keen
fonte
0

É 2019 e não há como eu ainda usar grep para pesquisa de texto recursiva.

As respostas do IMHO de hoje devem incluir ripgrep :

rg <pattern> -ttxt
santa
fonte