如何确定一个tar归档文件的格式。

8
在Linux中,我如何确定用于创建给定tarball的格式?
我想检测一个给定的归档文件是使用posix还是gnu格式创建的。
我已经阅读了GNU tar的man页面,其中解释了如何在创建过程中控制格式。然而,在现有文件中查看格式的内容并没有提到。

还有一个相关的问题在这里提出:http://superuser.com/questions/759006/how-to-find-tar-format-of-archive,其中建议在Windows上使用7zip进行检查。 - rrauenza
只是一个小的X-Y解决方案 - 如果你来到这里寻找答案,想知道为什么你生成的tar.gz文件被其他系统拒绝/报告为无效(无论你使用什么方案/模式),尝试分析它的结构。我曾经苦苦挣扎于GNU/POSIX模式,但没有成功,直到我检查并意识到我的生成的tar.gz文件不包含文件夹条目(只有文件),这是它被远程系统拒绝的实际原因。 - Janaka Bandara
1个回答

13

在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手册此处描述的格式和更多细节此处


是的,我正要用这个回答我的问题。我遇到的问题是如果存档被压缩了,那么file就没用了。所以,我必须先解压它。感谢您(快速)的回答!如果您更新响应以指出必须先解压存档,我将接受此解决方案。 - Christopher
我进行了一些编辑以更详细地阐述。感谢您提供的有用答案。 - Christopher
1
@christopher 我也刚尝试了Python 2和3下的 tarfiletar = tarfile.open("posix.tar")tar = tarfile.open("gnu.tar") 都会得到一个tar.format 等于1,而这个值代表的是 tarfile.GNU_FORMAT - rrauenza
1
您还可以执行 cat foo.tar.gz | gunzip | file - 以从标准输入中识别数据。然后,foo.tar.gz 不会在文件系统中解压缩为 foo.tar,而是保持完整。 - Lassi
@Lassi 谢谢。我更新了帖子,展示了这个选项,但是没有使用 cat 命令,只用了一个管道符号。 - Christopher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接