
У меня есть несколько файлов .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
каждый из них по отдельности.