web-dev-qa-db-fra.com

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

Étant donné cet exemple de structure de dossiers:

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

Comment puis-je effectuer une recherche de texte récursive sur tous les *.txt fichiers avec grep de "/"?

("grep -r <pattern> *.txt" échoue lors de l'exécution à partir de "/", car il n'y a pas de .txt fichiers dans ce dossier.)

46
Anders Sandvig

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 la correspondance générique comme décrit sous --exclure).

62
Kyle Brandt

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>
20
Mark

vous pourrez peut-être utiliser votre zsh's EXTENDED_GLOB option ( docs )

grep <pattern> **/*.txt
2
santa

Vous voudrez peut-être jeter un œil à ack sur http://betterthangrep.com , qui dispose de fonctions pour sélectionner les fichiers à rechercher par type de fichier.

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

La réponse de Mannis entraînerait un nouveau processus grep pour chaque fichier texte. Si vous avez lots de fichiers texte, vous pourriez d'abord envisager d'accueillir chaque fichier et de choisir les fichiers .txt lorsque cela est fait:

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

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

0
Commander Keen

Nous sommes en 2019 et il n'y a aucun moyen d'utiliser encore grep pour la recherche récursive de texte.

Les réponses d'aujourd'hui à mon humble avis devraient inclure ripgrep :

rg <pattern> -ttxt
0
santa