Mon problème actuel est que j'ai environ 10 dossiers, qui contiennent des fichiers compressés (environ 5 en moyenne chacun). Cela fait 50 fichiers à ouvrir et à regarder.
Existe-t-il une méthode plus simple pour savoir si un fichier compressé dans un dossier a un modèle particulier ou non?
zcat ABC/myzippedfile1.txt.gz | grep "pattern match"
zcat ABC/myzippedfile2.txt.gz | grep "pattern match"
Au lieu d'écrire un script, puis-je faire la même chose sur une seule ligne, pour tous les dossiers et sous-dossiers?
for f in `ls *.gz`; do echo $f; zcat $f | grep <pattern>; done;
zgrep cherchera dans les fichiers gzippés, a une option -R récursive et -H me montrer l'option nom de fichier:
zgrep -R --include=*.gz -H "pattern match" .
Vous n'avez pas besoin de zcat ici car il y a zgrep et zegrep.
Si vous souhaitez exécuter une commande sur une hiérarchie de répertoires, vous utilisez find:
find . -name "*.gz" -exec zgrep ⟨pattern⟩ \{\} \;
Et aussi "ls *.gz
”Est inutile dans for et vous devriez simplement utiliser“ * .gz ”à l'avenir.
comment zgrep ne prend pas en charge -R
Je pense que la solution de "Nietzche-jou" pourrait être une meilleure réponse, mais j'ajouterais l'option -H pour afficher le nom du fichier quelque chose comme ça
find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;
utilisez la commande find
find . -name "*.gz" -exec zcat "{}" + |grep "test"
ou essayez d'utiliser l'option récursive (-r) de zcat
Arriver un peu tard, a eu un problème similaire et a pu résoudre l'utilisation;
zcat -r /some/dir/here | grep "blah"
Comme détaillé ici;
http://manpages.ubuntu.com/manpages/quantal/man1/gzip.1.html
Cependant, cela n'affiche pas le fichier d'origine à partir duquel le résultat correspond, mais affiche plutôt "(entrée standard)" lorsqu'il provient d'un tuyau. zcat ne semble pas non plus prendre en charge la sortie d'un nom.
En termes de performances, c'est ce que nous avons obtenu;
$ alias dropcache="sync && echo 3 > /proc/sys/vm/drop_caches"
$ find 09/01 | wc -l
4208
$ du -chs 09/01
24M
$ dropcache; time zcat -r 09/01 > /dev/null
real 0m3.561s
$ dropcache; time find 09/01 -iname '*.txt.gz' -exec zcat '{}' \; > /dev/null
0m38.041s
Comme vous pouvez le voir, en utilisant le find|zcat
la méthode est beaucoup plus lente que l'utilisation de zcat -r
lorsque vous traitez même un petit volume de fichiers. Je n'ai pas non plus pu faire sortir zcat le nom du fichier (en utilisant -v
affichera apparemment le nom du fichier, mais pas sur chaque ligne). Il semblerait qu'il n'existe actuellement aucun outil qui fournisse à la fois la vitesse et la cohérence des noms avec grep (c'est-à-dire le -H
option).
Si vous devez identifier le nom du fichier auquel appartient le résultat, vous devrez alors écrire votre propre outil (cela peut être fait en 50 lignes de Python) ou utiliser le Si vous n'avez pas besoin d'identifier le nom, utilisez zcat -r
.
J'espère que cela t'aides
find . -name "*.gz"|xargs zcat | grep "pattern"
devrait faire.
zgrep "string" ./*/*
Vous pouvez utiliser la commande ci-dessus pour rechercher string
dans les fichiers .gz du répertoire dir
où dir
a la structure de sous-répertoires suivante:
/dir
/childDir1
/file1.gz
/file2.gz
/childDir2
/file3.gz
/file4.gz
/childDir3
/file5.gz
/file6.gz