如何确定 tar 存档的格式

How to determine a tar archive's format

在 Linux 中,如何确定用于创建给定 tarball 的格式?

我想检测给定的存档是否使用 posixgnu 格式创建。

我已经阅读了 man page for GNU tar,其中解释了如何在创建过程中控制格式。但是,我没有看到有关如何查看现有文件格式的任何信息。

可以使用Linux下的file查看解压后的存档指纹:

$ touch foo                                 # create test file
$ tar --format=posix -cf posix.tar foo      # create test posix archive
$ tar --format=gnu   -cf gnu.tar   foo      # create test gnu archive
$ file posix.tar gnu.tar
posix.tar: POSIX tar archive
gnu.tar:   POSIX tar archive (GNU)

如果存档是压缩的,请先解压,因为file不会超越压缩层:

$ touch foo                                 # create test file
$ tar --format=posix -czf posix.tar.gz foo  # create test gzip posix archive
$ tar --format=gnu   -czf gnu.tar.gz   foo  # create test gzip gnu archive
$ file posix.tar.gz gnu.tar.gz              # show output when compressed
posix.tar.gz: gzip compressed data
gnu.tar.gz:   gzip compressed data
$ gunzip posix.tar.gz                       # decompress to posix.tar
$ gunzip gnu.tar.gz                         # decompress to gnu.tar
$ file posix.tar gnu.tar                    # show output after decompression
posix.tar: POSIX tar archive
gnu.tar:   POSIX tar archive (GNU)

或者,通过将输出直接传输到 file 的标准输入来检查压缩档案而不保存解压缩文件:

$ gunzip --stdout posix.tar.gz | file -
/dev/stdin: POSIX tar archive
$ gunzip --stdout gnu.tar.gz | file -
/dev/stdin: POSIX tar archive (GNU)

GNU 基于较旧的 POSIX 格式,所以这就是为什么它说两者兼而有之。

对于具体细节,GNU tar 手册中描述了格式 here and more details here