web-dev-qa-db-fra.com

Recherche d'une chaîne sur plusieurs fichiers Zip

Je travaille sur SunOS 5.10. J'ai un dossier qui contient environ 200 fichiers Zip. Chaque fichier Zip contient un seul fichier texte. Je voudrais rechercher une chaîne spécifique dans tous les fichiers texte de tous les fichiers Zip.

J'ai essayé ceci (qui recherche n'importe quel fichier texte dans le fichier Zip contenant la chaîne "ORA-") mais cela n'a pas fonctionné.

zipgrep ORA-1680 *.Zip

Que faut-il faire sans décompresser les fichiers Zip?

25
ziggy

Il n'est généralement pas possible de rechercher du contenu dans un fichier compressé sans le décompresser d'une manière ou d'une autre. Comme zipgrep n'est qu'un shellscript, enveloppant unzip et egrep lui-même, vous pourriez tout aussi bien le faire manuellement:

for file in *.Zip; do unzip -c "$file" | grep "ORA-1680"; done

Si vous avez juste besoin de la liste des fichiers Zip correspondants, vous pouvez utiliser quelque chose comme:

for file in *.Zip; do
    if ( unzip -c "$file" | grep -q "ORA-1680"); then
        echo "$file"
    fi
done

De cette façon, vous décompressez uniquement vers la sortie standard (c'est-à-dire vers la mémoire) au lieu de décompresser les fichiers sur le disque. Vous pouvez bien sûr essayer de simplement grep -a les fichiers Zip mais en fonction du contenu du fichier et de votre modèle, vous pouvez obtenir des faux positifs et/ou des faux négatifs.

27
Noah

zipgrep prend un seul fichier. Pour le faire fonctionner sur plusieurs fichiers, mettez-le en boucle:

for i in *.Zip
do
   zipgrep ORA-1680 "$i"
done
18
dogbane

Le système de fichiers AVFS présente une vue du système de fichiers où chaque fichier d'archive /path/to/foo.Zip est accessible en tant que répertoire ~/.avfs/path/to/foo.Zip#. C'est un système de fichiers Fuse , que vous pouvez installer sur Solaris. AVFS fournit un accès en lecture seule aux formats de fichiers d'archives les plus courants.

mountavfs
for z in ~/.avfs$PWD/*.Zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional