Comment puis-je rechercher une chaîne de manière récursive dans tous les .gzfichiers de tous les répertoires et sous-répertoires?
Comment puis-je rechercher une chaîne de manière récursive dans tous les .gzfichiers 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
xargsfournira 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 findcommande. L'utilisation des options -print0et lui -0permet 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 {} +
-Hpour 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 -rpour parcourir un arbre ou si le -r ne fonctionne pas, canalisez la sortie de la recherche viaxargs zgrep
/bin/zgrep: -r: option not supportedsur mon système ubuntu nouvellement installé.
xargsplace.
@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/nullfera 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' -execargument à rechercher ajoutera autant de noms de fichiers que possible (similaire à la façon dont xargsse 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).
-Hpour toujours afficher le nom du fichier avec la ligne correspondante, au moins dans GNU grep, au lieu du /dev/nullhack.