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 zip
fichier:
$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
file1.jpg
file1.png
file2.jpg
file2.png
L' -sf
option indique zip
de lister les fichiers contenus dans une archive. Ensuite, le grep
va rechercher un .png
ou .jpg
qui se trouvent à la fin de la ligne ( $
). Le -E
permet des expressions régulières étendues, donc nous pouvons utiliser |
comme OR et le -i
rend 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 file
sur 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
, .tgz
ou .zip
fichiers (vous pouvez ajouter autant d'extensions que vous le souhaitez), ceux-ci sont ensuite passés par mon script. Le -q
supprime la sortie normale de grep, rien ne sera imprimé. Le && echo
affichera le nom de l'archive uniquement si l'opération grep
a réussi.
foo
mais pasfoo.png
.