A abordagem mais simples seria listar o conteúdo do arquivo e procurar por arquivos da extensão relevante. Por exemplo, com um arquivo zip :
$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
file1.jpg
file1.png
file2.jpg
file2.png
A opção -sf informa zip para listar os arquivos contidos em um arquivo. Em seguida, o grep procurará um .png ou .jpg que esteja no final da linha ( $ ). O -E ativa expressões regulares estendidas, portanto, podemos usar | como OR e o -i torna o caso de correspondência insensível.
No entanto, cada ferramenta de arquivo tem um comando diferente para listar o conteúdo. Eu escrevi um script que pode lidar com a maioria dos mais populares. Se você salvar esse script como list_compressed.sh , poderá executar:
list_compressed.sh | grep -iE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$'
Isso mostra os tipos de imagem mais comuns. Observe que essa abordagem pressupõe que o tipo de arquivo pode ser determinado pela extensão do arquivo. Ele não encontrará arquivos de imagem que não tenham uma extensão e não reconhecerá arquivos com a extensão incorreta. Não há como lidar com isso sem realmente extrair os arquivos do archive e executar file em cada um deles.
Se você quiser encontrar todos os arquivos que contenham arquivos de imagem em seu disco rígido, combine o acima com 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
O comando find pesquisará todos os arquivos .gz , .tgz ou .zip (você pode adicionar quantas extensões quiser), depois elas serão passadas pelo meu script. O -q suprime a saída normal do grep, nada será impresso. O && echo imprimirá o nome do arquivo somente se o grep for bem-sucedido.