Ricerca di testo ricorsiva con modelli grep e file


46

Dato questo esempio di struttura delle cartelle:

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

Come posso effettuare una ricerca di testo ricorsiva su tutti i *.txtfile con grepda "/"?

( "grep -r <pattern> *.txt"fallisce quando eseguito da "/", poiché non ci sono .txtfile in quella cartella.)

Risposte:


61

La mia versione di GNU Grep ha un interruttore per questo:

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

Descritto come segue:

--include=GLOB

Cerca solo i file il cui nome di base corrisponde a GLOB (usando la corrispondenza con caratteri jolly come descritto in --exclude).


19

Se si dispone di un numero elevato di file, sarebbe utile incorporare xargs nel comando per evitare un errore "Elenco argomenti troppo lungo".

find . -name '*.txt' -print | xargs grep <pattern>

6
Se sono presenti spazi in uno dei nomi di file o directory, utilizzare questo modulo: trova. -name '* .txt' -print0 | xargs -0 grep <pattern>
Jason Luther,

2
E ovviamente c'è il problema dei nomi di file che iniziano con -.
TJ Crowder,

grepè più veloce di find.
Nabi KAZ,

2

si potrebbe essere in grado di fare uso del vostro zsh's EXTENDED_GLOBopzione ( docs )

grep <pattern> **/*.txt

Solo se OP utilizza zsh, ma comunque interessante.
Legge del


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

potresti voler usare "find. -name '* .txt' -type f -exec grep <pattern> {} +" invece in modo che si comporti in modo simile alla verifica di Mark Robinson - funziona solo con GNU trova a mia conoscenza
serverhorror,

0

La risposta di Mannis avrebbe rovesciato un nuovo processo grep per ogni file di testo. Se hai molti file di testo lì, potresti considerare di eseguire prima il grepping di ogni file e scegliere i file .txt al termine:

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

È più intensivo per il disco, ma potrebbe essere comunque più veloce.


0

È il 2019 e non potrei mai usare grep per la ricerca di testo ricorsiva.

Le risposte di IMHO di oggi dovrebbero includere ripgrep :

rg <pattern> -ttxt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.