如何合并/合并zip文件?


21

在过去的几个月中,我每周都将几个数据文件夹复制到zip文件中。现在,我想将这些zip文件合并为一个zip文件,因为现有zip文件的大多数内容只是同一数据文件的不同版本。

因此,如果一个文件出现在多个现有zip文件中,则我希望最新版本位于正在创建的新zip文件中。当然,如果文件仅出现在一个现有的zip文件中,那么我也希望它出现在最终的zip文件中。

我试图避免将它们一个一个地解压缩到一个工作文件夹中,用较新的zip文件中的数据覆盖较旧zip文件中的数据,然后将所有内容重新压缩为一个新的zip文件。

据我了解,pkzip会自己合并zip文件,但是有人可以告诉我一种可靠且快速的免费方法吗?


1
zipmerge取胜
Code Bling

Answers:


7

您可能会不喜欢它,但是:按照正确的顺序将所有内容解压缩到工作文件夹中,然后将结果压缩是最有效的方法。

否则,您将浪费很多CPU周期:

  • 假设您的结果进入“ first.zip”
  • 必须解压缩“ 2.zip”,“ 3.zip”等中的每个文件,然后再次将其压缩到“ first.zip”中
  • 在“ 2.zip”中存在一个文件“ foobar.txt”,在“ 3.zip”中存在另一个文件“ foobar.txt”。以您要合并的方式进行合并会导致“压缩X次”
  • .zip的目录位于文件的末尾:您添加了更多内容(
    通过更新中间文件来添加到.zip的中间),并且整个文件都必须重写

因此,恕我直言,只是用“ 解压 ” wiseley:

% mkdir all
% for x in *.zip ; do unzip -d all -o -u $x ; done
% zip -r all.zip all

解压缩的顺序很重要,我不知道您的zip名称的格式,但是我会首先提取最新的zip文件,“-u”选项的unzip仅覆盖较新的文件,否则会覆盖文件已经在那了。结果,您将仅解压缩最新文件,并且仅将结果压缩一次。


从用户的角度来看,这可能是最有效的方法-但并不准确。zip中的文件表实际上位于结尾处,但是您可以将文件随意写入任何zip的末尾,然后写入新的文件表。最后一条记录总是获胜。那些稍微熟悉脚本或编程的人员可以完成整个过程,而无需解压缩或压缩任何文件,而只需移动二进制块并更新zip表即可。
caesay

实际上,您可以将所有zip文件串联到一个文件中(按您想要的顺序),然​​后在末尾写一个新的文件记录,以仅包括最新版本的文件。这样做的额外好处是,拉链仍然包含所有文件的以前版本可如果被所必要的康复
caesay

“必须先解压缩'2.zip','3.zip'等中的每个文件,然后再将其压缩到'first.zip'中”。例如,该zipmerge实用程序无需压缩和重新压缩即可合并ZIP存档。
ZachB '18

我用过unzipping/ zipping没用过uncompress / decompress。是的,很明显,一个人可以2.zip(压缩的blob)的一个条目并将其传输到first.zip,因此不必进行“压缩”。但是,您必须从中提取Blob 2.zip,在TOC的TOC中查找是否存在 first.zip,如果该Blob 替换了现有条目(这意味着您必须基本上重写整个文件)或在末尾附加它-之后,您需要附加邮编的目录。我看不到如何zipmerge以不同的方式(不考虑压缩)实现邮政编码的合并
akira

-1是因为有更有效的方法来执行此任务,而将这种“最有效的方法”作为理由没有丝毫意义。every file [...] has to be unzipped and then zipped again-不,这就是您的解决方案所要做in '2.zip' exists a file 'foobar.txt' and in '3.zip' exists another file 'foobar.txt'. merging it the way you want to merge it leads to 'compress it X times'-不,不是。为什么会这样?you add more content [...] and the whole file has to be rewritten-不,您只需要写一次输出。为什么有人支持这个?
benrg

4

只需使用ZIP的-g选项,即可在其中将任意数量的ZIP文件追加到一个文件中(而无需提取旧文件)。这将为您节省大量时间。

也看看zipmerge


4
-g将文件添加到现有的zip中。它不会合并它们。例如:zip -g result.zip other.zip将文件添加other.zip到result.zip . --grow增加(附加)指定的zip存档,而不是创建一个新的zip存档。如果此操作失败,则zip尝试将存档恢复到其原始状态。如果还原失败,则存档可能已损坏。当没有现有的档案或忽略此选项时,至少一个归档成员必须被更新或deleted.`



1

我以为您可以对要提取到临时目录中的文件进行脚本编写。

此命令行有问题。我找不到命令解压缩档案的方法,因此较旧的档案可能会覆盖较新的档案。通过使用解压缩程序可以解决此问题,该程序具有一个命令行开关,仅在更新时才覆盖。我主要使用7-Zip,它没有这样的命令行选项。

同样,此命令需要将所有zip文件放在同一目录中。如果所有zip都有唯一的名称,这不是问题。也就是说,可以根据您的情况更改命令。

for /f %f in ('dir /b *.zip') do "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoa

要将其更改为使用其他解压缩程序,只需用"c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoa要在每个文件上执行的命令替换即可。使用%f为您要解压缩文件的文件名的占位符。

我尝试寻找一款精美的应用程序,免费或其他方式,但并没有真正找到一个。

希望这会为您提供一个良好的开端,并且WinZip或类似的东西可以解决覆盖问题。

祝好运。


0

如果我没记错的话,pkzip是一个命令行程序。

仍然有一个ZIP命令行版本,声称与pkzip兼容。

它称为Info-ZIP,并且应该为您的OS提供一个版本。


它具有我要询问的功能吗?我找不到它列出此功能的地方。
CChriss 2010年

1
Info-Zip套件使文件与PKZip兼容,但是程序本身是不同的,并且似乎不包含合并选项。
Carf

好的,抱歉,很多年前,我能够在DOMAIN / OS下的Apollo工作站上编译并运行Info-Zip。我记得它甚至在DOS / VMS / Unix和其他一些功能上提供了不同的功能。我想它可能会进一步发展。
pavium 2010年

0

在网上寻找winzip命令行。Winzip具有几个版本的命令行工具,以适应您可能已安装的任何版本的winzip。命令行工具WZZIP具有-f“ freshen”选项,该选项将仅压缩与总和输出zip文件中与文件名匹配的文件的较新文件。

使用上面包裹在FOR语句中的WZunzip将一个文件解压缩到目录,然后使用WZzip -f将那些文件添加到输出汇总zip文件中。然后,FOR循环重复执行下一个输入文件,以输出到一个唯一的求和输出文件。输入文件的顺序无关紧要,因为WZzip -f仅在输入数据比输出文件中已有的数据新时才添加到输出文件中。输出文件中不存在的所有文件也将被添加。然后,您可以将结果解压缩到文件夹,然后再次将其压缩以获取有效打包的结果文件。您甚至可以在批处理文件末尾的FOR循环之后自动执行此操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.