Como saber o tipo real de arquivos dentro de um arquivo zip ou tar.gz?

Como saber o tipo real de arquivos dentro de um arquivo zip ou tar.gz?

Tenho vários arquivos .tar.gz e .zip e queria saber os tipos de arquivos dentro desses arquivos sem extraí-los. Como posso conseguir isso. Posso listar os arquivos .tar.gz usando o comando tar -tzf 'filename'e unzip -l 'filename'. Não consegui encontrar uma maneira de identificar os tipos de arquivos dentro desses arquivos. Como posso conseguir isso? Estou usando o centos 6.6

Saída do comandotar -tzf 'test.tar.gz'

-rw-r--r-- root/root     89403 2019-05-26 11:31 abc.tar.gz
-rw------- root/root      2842 2019-05-26 09:41 anaconda-ks.cfg
-rw-r--r-- root/root      8823 2019-05-26 09:41 install.log
-rw-r--r-- root/root      3314 2019-05-26 09:40 install.log.syslog
-rw-r--r-- root/root    122880 2019-05-26 11:28 tin.tar
-rw-r--r-- root/root     25543 2019-05-26 11:20 tito.zip
-rw-r--r-- root/root     25487 2019-05-27 07:48 tito.ZIP

saída deunzip -l test.zip

 Length      Date    Time    Name
---------  ---------- -----   ----
    89403  05-26-2019 11:31   abc.tar.gz
     2842  05-26-2019 09:41   anaconda-ks.cfg
     8823  05-26-2019 09:41   install.log
     3314  05-26-2019 09:40   install.log.syslog
   122880  05-26-2019 11:28   tin.tar
    25543  05-26-2019 11:20   tito.zip
    25487  05-27-2019 07:48   tito.ZIP
---------                     -------
   278292                     7 files

Responder1

Com GNU tar:

tar --to-command='exec file -b -' -xvvf file.tar.gz

Para ziparquivos, você pode converter tarinstantaneamente usando bsdtaro GNU tarnovamente para chamar filecada membro:

bsdtar cf - @file.zip | tar --to-command='exec file -b -' -xvvf -

Ele fornece uma saída como:

-rw-rw-r-- 0/0            7653 1999-12-30 10:26 WINOBJ.HLP
MS Windows 3.1 help, Thu Dec 30 15:26:17 1999, 7653 bytes
-rw-rw-r-- 0/0            7005 2006-07-28 08:32 Eula.txt
Non-ISO extended-ASCII text, with very long lines, with CRLF line terminators
-rw-rw-r-- 0/0          729464 2011-02-14 11:37 Winobj.exe
PE32 executable (GUI) Intel 80386, for MS Windows

O filecomando adivinha otipode um arquivo usando heurística baseada nos primeiros bytes do arquivo. Portanto, em qualquer caso, os dados precisam ser extraídos do arquivo. Até para reportar a tar tvfsaída, taré necessário ler e descompactar o arquivo completo, pois as informações são armazenadas antes do conteúdo de cada membro do arquivo, mas nenhuma das soluções acima extrai os membrospara disco, os dados são passados ​​de bsdtare tarpara taratravés filede pipes, o conteúdo dos membros do arquivo nem mesmo é armazenado como um todo na memória.

Depois de fileretornar depois de ler os primeiros bytes do arquivo, o GNU tarlida com isso de maneira inteligente e pula o restante do membro do arquivo (em vez de morrer de um SIGPIPE) antes de executar o próximo filecomando para o próximo membro do arquivo.

O que não é ideal do ponto de vista da eficiência é que ele executa um sh(para interpretar a exec file -b -linha de comando) e um filecomando para cada membro regular do arquivo morto. Usamos execpara que o mesmo processo seja reutilizado para she file(para shimplementações como dashessa não fazem essa otimização sozinhas).

Responder2

O filecomando deve informar sobre o próprio arquivo:

$ file test.zip
test.zip: Zip archive data, at least v1.0 to extract
$ file test.tar.gz
test.tar.gz: gzip compressed data, last modified: Sun May 26 11:28:34 2019, from Uniz

Mas para os arquivos dentro dos arquivos, você precisará extraí-los e executá file-los individualmente.

informação relacionada