É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.)
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).
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>
vous pourrez peut-être utiliser votre zsh
's EXTENDED_GLOB
option ( docs )
grep <pattern> **/*.txt
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.
find . -name '*.txt' -type f -exec grep <pattern> {} \;
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.
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