在 Linux 上使用 split 和 cat 后 zip 文件损坏

在 Linux 上使用 split 和 cat 后 zip 文件损坏

我必须拆分这个 2.6 GB 的 zip 文件,以便通过慢速上行链路发送它。我这样做了:

split -b 879m BIGFILE.zip

这创建了 xaa、xab 和 xac,我将它们上传到远程服务器。传输完成后,我使用 md5sum 验证了这 3 个部分中的每一个(在本地系统和服务器上):

md5sum xaa
md5sum xab
md5sum xab

这 3 个哈希值与我系统上的 3 个哈希值相同,因此传输顺利。现在,在远程系统上,当我执行以下操作时:

cat xa* > BIGFILE.zip

...然后我验证这个 BIGFILE.zip 的哈希值(在两个系统上):

md5sum BIGFILE.zip

...并且它们都匹配。

现在到了最有趣的部分。当我尝试列出 zip 文件的内容时,出现错误:

unzip -l BIGFILE.zip

我得到:

Archive:  BIGFILE.zip
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of BIGFILE.zip or
        BIGFILE.zip.zip, and cannot find BIGFILE.zip.ZIP, period.

这真是太奇怪了。我在两个系统上使用相同版本的“unzip”。当我在本地系统上使用“unzip -l”时,它可以正常工作。

谢谢您的帮助。JFA

答案1

相同的 MD5 哈希值表明传输过程正常。

超过 2G 的文件大小听起来像是指针大小问题 - 也许有问题的 zip 不能很好地处理这个问题?在 32 位系统中,超过 (ca) 2G 会是一个负数... 您可以在压缩文件的系统上解压文件吗?两个系统不同吗?一个是 64 位的,有问题的 32 位的?两个系统的文件系统是什么?您能找到另一个 zip 实用程序吗?

如果您有机会重新传输内容,您可能需要使用 tar.gz 或保持文件大小低于该值。gzip 压缩内容应该能更好地处理这个问题。Zip 将内容(索引)存储在文件末尾。

编辑:是的,看这里

实际上,由于 UnZip 使用 fseek() 函数在存档内跳转,因此许多系统上的实际限制可能是 2 GB。由于 fseek 的偏移量参数通常是一个有符号长整数,因此在 32 位系统上,UnZip 不会找到距离存档开头超过 2 GB 的任何文件 [...]

答案2

你应该改用 rsync。split 很糟糕。话虽如此,我不知道你的问题出在哪里。哦……等等……你现在可以使用 rsync 了。它只会传输文件之间的差异。假设你在远程机器上有 ssh 访问权限:

rsync -Pvz BIGFILE.zip remotehostname:/path/to/BIGFILE.zip

...您就完成了。

答案3

您是如何传输文件的?如果您通过 FTP ASCII 模式传输文件,则文件会被破坏。您可能能够使用 unzip 的 -F 标志来更正此问题,但不要指望它。

您可能需要重新传输文件 - 我建议通过 scp 进行

相关内容