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?
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.
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
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