【问题标题】:How to determine a tar archive's format如何确定 tar 存档的格式
【发布时间】:2016-10-02 21:05:09
【问题描述】:

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

我想检测给定的存档是使用 posix 还是 gnu 格式创建的。

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

【问题讨论】:

  • 也在此处询问:superuser.com/questions/759006/…,建议在 Windows 上使用 7zip 进行检查。
  • 只是一个小的X-Y 解决方案 - 如果您来这里寻找关于为什么您生成的 tar.gz 被其他系统拒绝/报告为无效的答案(无论什么方案/模式您使用),尝试分析其结构。我在 GNU/POSIX 模式下苦苦挣扎,没有运气,直到我检查并意识到我生成的 tar.gz 不包含文件夹条目(仅文件),这是它被远程系统拒绝的实际原因。

标签: linux posix command-line-interface gnu tar


【解决方案1】:

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 和更多详细信息here 中进行了描述。

【讨论】:

  • 是的,我正准备用这个来回答我自己的问题。我遇到的问题是,如果存档被压缩,file 将毫无用处。所以,我必须先解压缩它。感谢你及时的答复!如果您更新响应以说明必须先解压缩存档,我将接受此作为解决方案。
  • 我进行了编辑以扩展更多内容。感谢您提供有用的答案。
  • @christopher 我也刚刚在 Python 2 和 3 下尝试了tarfile,而tar = tarfile.open("posix.tar")tar = tarfile.open("gnu.tar") 最终的tar.format 都等于1,即tarfile.GNU_FORMAT
  • 您也可以使用cat foo.tar.gz | gunzip | file - 来识别来自标准输入的数据。然后foo.tar.gz不会在文件系统中解压成foo.tar,而是保持原样。
  • @Lassi 谢谢。我更新了帖子以将其显示为一个选项,但没有 cat 并且只使用一个管道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多