Recherche de texte récursive avec grep et modèles de fichiers

46

Étant donné cet exemple de structure de dossier:

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

Comment faire une recherche de texte récursive sur tous les *.txtfichiers avec grep"/"?

( "grep -r <pattern> *.txt"échoue lorsqu’il est exécuté à partir de "/", car il n’ya aucun .txtfichier dans ce dossier.)

Anders Sandvig
la source

Réponses:

61

Ma version de GNU Grep a un commutateur pour cela:

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

Décrit comme suit:

--include=GLOB

Recherchez uniquement les fichiers dont le nom de base correspond à GLOB (en utilisant une correspondance générique comme décrit sous --exclude).

Kyle Brandt
la source
19

Si vous avez un grand nombre de fichiers, il serait utile d'incorporer xargs dans la commande pour éviter une erreur 'Argument list too long'.

find . -name '*.txt' -print | xargs grep <pattern>
marque
la source
6
S'il existe des espaces dans l'un des noms de fichier ou de répertoire, utilisez le formulaire suivant: find. -name '* .txt' -print0 | xargs -0 grep <modèle>
Jason Luther
2
Et bien sûr, il y a la question des noms de fichiers qui commence par -.
TJ Crowder le
grepest plus rapide de find.
Nabi KAZ
2

vous pourriez être en mesure d'utiliser votre zshde » EXTENDED_GLOBoption ( docs )

grep <pattern> **/*.txt
Père Noël
la source
Seulement si OP utilise zsh, mais néanmoins intéressant.
Law29
1

Vous voudrez peut-être consulter ack à l'adresse http://betterthangrep.com , qui permet de sélectionner les fichiers à rechercher par type de fichier.

Andy Lester
la source
0
find . -name '*.txt' -type f -exec grep <pattern> {} \;
innaM
la source
vous voudrez peut-être utiliser "find. -name '* .txt' -type f -exec grep <modèle> {} +" pour qu'il se comporte plutôt comme la version de Mark Robinson - fonctionne uniquement avec GNU find à ma connaissance
serverhorror
0

La réponse de Mannis créerait un nouveau processus grep pour chaque fichier texte. Si vous avez beaucoup de fichiers texte là-bas, vous pouvez commencer par chercher d'abord tous les fichiers et choisir les fichiers .txt à la fin:

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

C'est plus gourmand en disque, mais peut être plus rapide de toute façon.

Commandant Keen
la source
0

Nous sommes en 2019 et il est impossible que j'utilise quand même grep pour la recherche de texte récursive.

Les réponses devraient inclure mon humble avis ripgrep :

rg <pattern> -ttxt
Père Noël
la source