Comment puis-je rechercher une chaîne de manière récursive dans tous les .gz
fichiers de tous les répertoires et sous-répertoires?
Comment puis-je rechercher une chaîne de manière récursive dans tous les .gz
fichiers de tous les répertoires et sous-répertoires?
Réponses:
@Steve Weet est presque là. L'utilisation de / dev / null comme argument supplémentaire est une bonne façon de forcer le nom du fichier à être affiché (je m'en souviendrai, merci Steve) mais il exécute toujours l'exec pour chaque fichier trouvé - une énorme surcharge.
Vous souhaitez exécuter zgrep le plus de fois possible, en tirant le meilleur parti de chaque exécution:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
fournira autant d'arguments (noms de fichiers) que possible à zgrep, et l'exécutera de manière répétée jusqu'à ce qu'il ait utilisé tous les fichiers fournis par la find
commande. L'utilisation des options -print0
et lui -0
permet de fonctionner s'il y a des espaces dans l'un des noms de fichier ou de répertoire.
Sur Mac OS X, vous pouvez obtenir le même effet sans xargs:
find . -iname '*.gz' -exec zgrep PATTERN {} +
-H
pour toujours afficher le nom du fichier avec la ligne correspondante, au moins dans GNU grep.
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.
Donc quelque chose comme
find . -iname "*.gz" -exec zgrep PATTERN {} \
zgrep -r
pour parcourir un arbre ou si le -r ne fonctionne pas, canalisez la sortie de la recherche viaxargs zgrep
/bin/zgrep: -r: option not supported
sur mon système ubuntu nouvellement installé.
xargs
place.
@aioobe est presque là. La commande fera le travail mais ne vous dira pas le nom du fichier
Les informations suivantes devraient également vous indiquer le nom du fichier:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
L'ajout de /dev/null
fera en sorte que zgrep voit deux noms de fichiers afin qu'il vous montre le nom du fichier s'il trouve la chaîne
ÉDITER
Des recherches plus approfondies révèlent que pour ma machine (OS / X), l' -exec
argument à rechercher ajoutera autant de noms de fichiers que possible (similaire à la façon dont xargs
se comporte).
-exec
- je suis tout au sujet de la portabilité, donc je ne l'utiliserais pas dans un script, mais parfait pour l'invite de commande.
find
, mais de la plupart des versions modernes (par exemple dans les distributions basées sur Debian).
-H
pour toujours afficher le nom du fichier avec la ligne correspondante, au moins dans GNU grep, au lieu du /dev/null
hack.