A abordagem mais simples seria listar o conteúdo do arquivo e procurar arquivos da extensão relevante. Por exemplo, com um zip
arquivo:
$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
file1.jpg
file1.png
file2.jpg
file2.png
A -sf
opção informa zip
para listar os arquivos contidos em um arquivo morto. Em seguida, grep
procurará um .png
ou .jpg
que esteja no final da linha ( $
). Ele -E
permite expressões regulares estendidas, para que possamos usar |
como OR e -i
torna a correspondência sem distinção entre maiúsculas e minúsculas.
No entanto, cada ferramenta de arquivamento possui 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 mostraria os tipos de imagem mais comuns. Observe que essa abordagem pressupõe que o tipo de arquivo possa ser determinado pela extensão do arquivo. Ele não encontrará arquivos de imagem que não tenham extensão e não reconhecerá arquivos com a extensão errada. Não há como lidar com isso sem realmente extrair os arquivos do arquivo morto e executar file
em cada um deles.
Se você deseja encontrar todos os arquivos que contêm arquivos de imagem no 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 irá procurar por todos .gz
, .tgz
ou .zip
arquivos (você pode adicionar quantas extensões quiser), que são passados pelo meu script. Os -q
suprime grep sua saída normal, nada será impresso. Ele && echo
imprimirá o nome do arquivo apenas se ele tiver grep
sido bem-sucedido.
foo
mas nãofoo.png
.