48 votes

trouver de la chaîne à l'intérieur d'un format de fichier dans un dossier

Mon problème actuel est que j'ai autour de 10 dossiers qui contiennent les fichiers gzip (autour d'une moyenne de 5 de chaque). De ce fait, il 50 fichiers à ouvrir et à regarder.

Est-il une méthode plus simple pour savoir si un fichier au format gzip l'intérieur d'un dossier a un modèle particulier ou pas?

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 en une seule ligne, pour tous les dossiers et sous-dossiers?

for f in `ls *.gz`; do echo $f; zcat $f | grep <pattern>; done;

58voto

Ned Batchelder Points 128913

zgrep va le chercher dans les fichiers gzip, a -R option récursif, et a-H montrez-moi l'option nom de fichier:

zgrep -R --include=*.gz -H "pattern match" .

21voto

Nietzche-jou Points 7711

Vous n'avez pas besoin zcat ici car il y a zgrep et zegrep.

Si vous souhaitez exécuter une commande sur une hiérarchie de répertoire, vous utilisez trouver:

find . -name "*.gz" -exec zgrep ⟨pattern⟩ \{\} \;

Et aussi "ls *.gz" est inutile dans pour et vous devriez utiliser "*.gz" dans l'avenir.

11voto

Francisco Lavin Points 129

comment zgrep ne prennent pas en charge -R

Je pense que la solution de "Nietzche-jou" pourrait être une meilleure réponse, mais je voudrais ajouter l'option-H pour afficher le nom du fichier à quelque chose comme ceci

find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;

8voto

ghostdog74 Points 86060

utilisation de la commande find

find . -name "*.gz" -exec zcat "{}" + |grep "test"

ou essayez d'utiliser l'option récursif (-r) de zcat

7voto

sleepycal Points 961

À venir un peu en retard sur ce, a eu un problème similaire et a été en mesure de résoudre à l'aide;

zcat -r /some/dir/here | grep "blah"

Comme détaillé ici;

http://manpages.ubuntu.com/manpages/quantal/man1/gzip.1.html

Cependant, ce n'affiche pas le fichier d'origine que le résultat correspond à la à partir, au lieu de montrer "(entrée standard)" comme à partir d'un tuyau. zcat ne semble pas à l'appui de la sortie d'un nom.

En termes de performances, c'est ce que nous avons reçu;

$ 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, à l'aide de l' find|zcat méthode est nettement plus lent que d'utiliser zcat -r lorsque vous traitez avec même un petit volume de fichiers. J'étais aussi incapable de faire zcat sortie le nom du fichier (à l'aide d' -v sera apparemment le nom de fichier de sortie, mais pas sur chaque ligne). Il semblerait qu'il n'y a pas actuellement un outil qui fournit à la fois la vitesse et le nom de la cohérence avec grep (c'est à dire l' -H option).

Si vous avez besoin d'identifier le nom du fichier que le résultat appartient, alors vous aurez besoin de rédiger votre propre outil (qui pourrait être fait dans les 50 lignes de code Python) ou utiliser la méthode plus lente. Si vous n'avez pas besoin d'identifier le nom, puis utilisez zcat -r.

Espérons que cette aide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X