`tar` 在 Linux 上的 `.zip` 时出错

Error when `tar` a `.zip` on Linux

我使用 zip 命令行和 -r 选项在 Mac OSX 上压缩了一个目录。我scp .zip 到在 Linux.

上运行的集群

如果我尝试用

解压.zip

tar -vxzf foo.zip

在我的机器上可以。但是相同的命令在集群上不起作用。我收到错误

gzip: stdin has more than one entry--rest ignored
tar: Child returned status 2
tar: Error is not recoverable: exiting now

我该如何解决这个问题?

这个错误:

gzip: stdin has more than one entry--rest ignored

意味着 tar 正在尝试解压缩您的 zip 存档,就好像它是 gzip 存档一样,但这并不总是有效(请参阅“Files created by zip can be uncompressed by gzip only if they have a single member compressed with the 'deflation' method" 了解更多信息)。

您应该使用 unzip foo.zip 来解压缩 zip 存档。

tar 命令用于解压缩 TAR 存档,而不是 zip 文件。您应该使用 unzip 命令而不是 tar:

unzip foo.zip

或者在 Mac 端创建一个 tar.gz 存档而不是 zip 文件

tar -cvzf foo.tar.gz ....

您可以在 Linux 端使用现有的 tar 命令解压。

标准 GNU tar 不直接处理 .zip 文件。我很惊讶 MacOSX 可以处理它。

问题是 tar 知道如何处理 gzip 文件,这些文件 不是 Zip (.zip) 格式文件。 Info-Zip 文件旨在处理归档和压缩,而 tar 则不能。 (大多数 tar 实施现在将根据命令行选项使用适当的 compressor/decompressor 过滤 tar 文件。)

改为在您的集群上使用 unzip。这是设计用于处理 .zip 文件的程序。你根本不需要 tar