El enfoque más simple sería enumerar el contenido del archivo y buscar archivos de la extensión relevante. Por ejemplo, con un zip
archivo:
$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
file1.jpg
file1.png
file2.jpg
file2.png
La -sf
opción le indica zip
que enumere los archivos contenidos en un archivo. Luego, grep
buscará uno .png
o .jpg
que están al final de la línea ( $
). El -E
permite extenderse expresiones regulares, así que podemos usar |
como O y la -i
hace el caso coincidente insensible.
Sin embargo, cada herramienta de archivo tiene un comando diferente para enumerar los contenidos. He escrito un guión que puede tratar con la mayoría de los más populares. Si guarda ese script como list_compressed.sh
, entonces podría ejecutar:
list_compressed.sh | grep -iE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$'
Eso le mostraría los tipos de imágenes más comunes. Tenga en cuenta que este enfoque supone que el tipo de archivo puede determinarse por la extensión del archivo. No encontrará archivos de imagen que no tengan una extensión y no reconocerá archivos con la extensión incorrecta. No hay forma de lidiar con eso sin extraer los archivos del archivo y ejecutarlos file
en cada uno de ellos.
Si desea encontrar todos los archivos que contienen archivos de imagen en su disco duro, combine lo anterior 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
El comando find buscará los materiales .gz
, .tgz
o .zip
archivos (se puede añadir tantas extensiones como desee), los que a continuación se pasan a través de mi guión. Los -q
suprime grep salida normal, nada se imprimirán. El && echo
imprimirá el nombre del archivo sólo si el grep
tuvo éxito.
foo
pero nofoo.png
.