自动化工具 - tar 这不像是一个tar归档文件。

17

在运行make distcheck后,我收到一条消息,告诉我已经成功构建了软件包并准备好进行分发。如果我使用tar -zxvf hello-0.2.tar.gz解压tar.gz文件,则可以成功提取其所有内容。然而,在尝试在不同的机器上提取它们时,我会收到以下错误:

tar: This does not look like a tar archive
tar: Skipping to next header
tar: Exiting with failure status due to previous errors

奇怪的是之前它是可以工作的。

在我尝试构建软件包的机器上,我已经将我的automake 1.10.1, autoconf 2.61和tar 1.20升级到了 automake 1.11.1, autoconf 2.65和 tar 1.23,但仍然存在同样的问题。

有任何想法是什么问题造成的吗?


10
这个命令可以吗:gzip -d hello-0.2.tar.gz 然后接着运行:tar -xf hello-0.2.tar - SiggyF
1
@SyggyF:它确实有效。有什么想法为什么这种方式有效而另一种方式无效? - denim69
2个回答

17

问题出现在目标机器上,而不是构建机器上。

并非所有版本的tar会自动识别要应用于压缩tar文件的解压缩方式。鉴于gunzip后跟tar的确可以工作,那么你的目标机器上的tar就是这样的版本。主流Unix系统(如AIX、HP-UX和Solaris)上的tar版本不会自动识别压缩的tar文件,但Linux和MacOS X上的版本会。

请注意,您可以使用:

gzip -dc hello-0.2.tar.gz | tar -xf -
为了避免创建中间的未压缩文件。

  1. 结尾的连字符只是一个打字错误,还是有什么作用吗?
  2. 使用这种方法时,我会收到错误消息“tar:归档已压缩。使用-z选项”“tar:错误无法恢复:现在退出”。如果我添加“-z”,它会给我“tar:-z:无法打开:没有那个文件或目录”。
- lindhe
(1)末尾的连字符指定输入文件为标准输入(-f -)。 (2)你可能有一个双重压缩的文件,虽然这有点不太可能。你可以尝试 gunzip hello-0.2.tar.gz,然后使用 file hello-0.2.tar 查看它认为你拥有的文件类型是什么。你使用哪个版本的 tar 来识别归档文件已经被压缩但没有解压缩?如果你使用 tar -xzf -,你可能没问题。如果你使用 tar -xf -z,那么你告诉 tar 要从 -z 中提取文件。 - Jonathan Leffler

5

实际上,当你从服务器下载文件时,如果服务器应用了另一轮的GZip压缩,而你所使用的客户端没有读取或尊重HTTP Content-Encoding头部,那么HTTP负载将会按照原始状态存储。

虽然该文件看起来只有扩展名为.tar.gz,但实际上是.tar.gz.gz。运行一次gunzip后,文件的扩展名变为.tar,但是这一次运行tar xf hello-0.2.tar命令时,它会识别GZip格式,并在提取之前隐式地再次运行文件通过gunzip进行解压。

您可以通过运行head hello-02.tar.gzhead hello-02.tar来检查此问题。GZip是一种非常二进制的格式,而tar则相对易于人类阅读。如果.tar文件看起来“过于二进制”,那么你手中就有一个双重编码的文件。


1
正是我的问题。非常感谢 :) - franzlorenzon

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