Как узнать настоящий тип файла внутри файла zip или tar.gz?

Как узнать настоящий тип файла внутри файла zip или tar.gz?

У меня есть несколько файлов .tar.gz и .zip, и я хотел бы узнать типы файлов внутри этих файлов, не извлекая их. Как мне этого добиться? Я могу вывести список файлов .tar.gz с помощью команды tar -tzf 'filename'и unzip -l 'filename'. Я не смог найти способ определить типы файлов внутри этих файлов. Как мне этого добиться? Я использую centos 6.6

Вывод командыtar -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

выходunzip -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

решение1

С GNU tar:

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

Для zipфайлов можно выполнить преобразование « tarна лету» с помощью bsdtarи снова использовать GNU tarдля вызова fileкаждого члена:

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

Вывод будет примерно таким:

-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

Команда fileугадываеттипфайла с использованием эвристики, основанной на первых нескольких байтах файла. Таким образом, в любом случае данные должны быть извлечены из файла. Даже для отчета о tar tvfвыходе tarнеобходимо прочитать и распаковать весь архив, поскольку информация хранится до содержимого каждого члена архива, но ни одно из этих решений выше не извлекает членовна диск, данные передаются из bsdtarодного в другой tarи из tarодного в другой fileпо каналам, содержимое элементов архива даже не сохраняется как единое целое в памяти.

После fileзавершения чтения первых нескольких байтов файла GNU tarобрабатывает его разумно и пропускает оставшуюся часть члена архива (вместо того, чтобы завершиться из-за сигнала SIGPIPE) перед выполнением следующей fileкоманды для следующего члена архива.

Где это не оптимально с точки зрения эффективности, так это то, что он запускает одну sh(для интерпретации exec file -b -командной строки) и одну fileкоманду для каждого обычного члена архива файлов. Мы используем execтак, чтобы тот же процесс повторно использовался для shи file(для таких shреализаций, как dashэта, не делают эту оптимизацию сами по себе).

решение2

Команда fileдолжна сообщить вам о самом файле:

$ 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

Но файлы внутри архивов вам придется извлечь и запустить fileкаждый из них по отдельности.

Связанный контент