L'approche la plus simple serait de lister le contenu de l'archive et de rechercher les fichiers de l'extension concernée. Par exemple, avec un zipfichier:
$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
file1.jpg
file1.png
file2.jpg
file2.png
L' -sfoption indique zipde lister les fichiers contenus dans une archive. Ensuite, le grepva rechercher un .pngou .jpgqui se trouvent à la fin de la ligne ( $). Le -Epermet des expressions régulières étendues, donc nous pouvons utiliser |comme OR et le -irend insensible à la casse correspondante.
Cependant, chaque outil d'archivage a une commande différente pour répertorier le contenu. J'ai écrit un script qui peut gérer la plupart des plus populaires. Si vous enregistrez ce script sous list_compressed.sh, vous pouvez alors exécuter:
list_compressed.sh | grep -iE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$'
Cela vous montrerait les types d'images les plus courants. Notez que cette approche suppose que le type de fichier peut être déterminé par l'extension du fichier. Il ne trouvera pas les fichiers image sans extension et ne reconnaîtra pas les fichiers avec la mauvaise extension. Il n'y a aucun moyen de gérer cela sans extraire les fichiers de l'archive et les exécuter filesur chacun d'eux.
Si vous souhaitez trouver toutes les archives contenant des fichiers image sur votre disque dur, combinez ce qui précède avec find:
find / -name '*.gz' -o -name '*.tgz' -o -name '*.zip' -print0 |
while IFS= read -r -d '' arch; do
list_compressed.sh "$arch" |
grep -qiE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$' &&
echo "$arch contains image(s)"
done
La commande find recherchera tous .gz, .tgzou .zipfichiers (vous pouvez ajouter autant d'extensions que vous le souhaitez), ceux-ci sont ensuite passés par mon script. Le -qsupprime la sortie normale de grep, rien ne sera imprimé. Le && echoaffichera le nom de l'archive uniquement si l'opération grepa réussi.
foomais pasfoo.png.