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.