L'approccio più semplice sarebbe quello di elencare i contenuti dell'archivio e cercare i file dell'estensione pertinente. Ad esempio, con un zipfile:
$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
file1.jpg
file1.png
file2.jpg
file2.png
L' -sfopzione dice zipdi elencare i file contenuti in un archivio. Quindi, grepcercherà un .pngo .jpgche si trovano alla fine della riga ( $). Il -Eabilitazioni esteso le espressioni regolari, in modo che possiamo usare |come OR e la -irende il caso di corrispondenza insensibile.
Tuttavia, ogni strumento di archiviazione ha un comando diverso per elencare i contenuti. Ho scritto una sceneggiatura in grado di gestire la maggior parte di quelli più popolari. Se si salva lo script come list_compressed.sh, è possibile quindi eseguire:
list_compressed.sh | grep -iE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$'
Ciò mostrerebbe i tipi di immagine più comuni. Si noti che questo approccio presuppone che il tipo di file possa essere determinato dall'estensione del file. Non troverà i file di immagine che non hanno un'estensione e non riconoscerà i file con l'estensione errata. Non c'è modo di affrontarlo senza effettivamente estrarre i file dall'archivio e eseguirli filesu ciascuno di essi.
Se si desidera trovare tutti gli archivi che contengono file di immagine sul disco rigido, combinare quanto sopra con 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
Il comando find cercherà tutti .gz, .tgzo .zipfile (puoi aggiungere tutte le estensioni che vuoi), che vengono poi passate attraverso il mio script. I -qSopprime grep è in uscita normale, niente verranno stampati. Il && echostamperà il nome del archivio solo se l' grepha avuto successo.
fooma nonfoo.png.