如何知道 zip 或 tar.gz 文件中文件的真实文件类型?

如何知道 zip 或 tar.gz 文件中文件的真实文件类型?

我有多个 .tar.gz 和 .zip 文件,我想知道这些文件中文件的文件类型而不解压它们。我怎样才能做到这一点。我可以使用命令tar -tzf 'filename'和列出 .tar.gz 文件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转换并再次使用 GNU来调用每个成员:tarbsdtartarfile

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成员的内容甚至没有作为一个整体存储在内存中。tarfile

file读取文件的前几个字节后返回后,GNUtar会巧妙地处理它,并在为下一个存档成员运行下一个命令之前跳过存档成员的其余部分(而不是死于 SIGPIPE)file

从效率的角度来看,它不是最佳的,因为它为每个常规文件归档成员运行一个命令sh(解释exec file -b -命令行)和一个命令。file我们使用exec相同的过程来重用shfile(对于那些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单独运行每个文件。

相关内容