在过去的几个月里,我每周都会将几个数据文件夹复制到 zip 文件中。现在我想将这些 zip 文件合并为一个 zip 文件,因为现有 zip 文件的大部分内容只是相同数据文件的不同版本。
因此,如果某个文件出现在多个现有 zip 文件中,我希望最新版本出现在正在创建的新 zip 文件中。当然,如果某个文件只出现在一个现有 zip 文件中,那么我希望它也出现在最终的 zip 文件中。
我试图避免将它们逐个解压缩到工作文件夹,用较新的 zip 文件中的数据覆盖较旧的 zip 文件中的数据,然后将所有内容重新压缩到新的 zip 文件中。
据我所知,pkzip 会将 zip 文件本身合并,但是有没有人可以告诉我一种可靠且快速的免费方法?
答案1
你不会喜欢它,但是:按照正确的顺序将所有内容解压到工作文件夹中,然后压缩结果是最有效的方法。
否则,你最终会浪费大量的 CPU 周期:
- 假设你的结果为“first.zip”
- 必须将“2.zip”、“3.zip”等中的每个文件解压缩,然后再次压缩到“first.zip”中
- 在 '2.zip' 中存在一个文件 'foobar.txt',在 '3.zip' 中存在另一个文件 'foobar.txt'。按照你想要的方式合并会导致“压缩 X 次”
- .zip 文件的目录位于文件末尾:如果要添加更多内容(
通过更新中间的文件将内容添加到 .zip 文件的中间),则必须重写整个文件
因此,我认为只需使用'解压缩'明智地:
% mkdir all
% for x in *.zip ; do unzip -d all -o -u $x ; done
% zip -r all.zip all
解压顺序很重要:我不知道您的 zip 名称的模式,但我会先提取最新的 zip 文件,解压的“-u”选项只会覆盖较新的文件,或创建尚不存在的文件。因此,您将仅解压最新的文件并仅压缩一次结果。
答案2
只需使用 ZIP 的 -g 选项,您就可以将任意数量的 ZIP 文件附加到一个文件中(无需提取旧文件)。这将为您节省大量时间。
另请参阅压缩合并
答案3
https://linux.die.net/man/1/zipmerge:
zipmerge 将源 zip 档案合并
source-zip
到目标 zip 档案中target-zip
。默认情况下,源 zip 档案中的文件将覆盖目标 zip 档案中现有的同名文件。
答案4
我在想你可以编写脚本将文件提取到临时目录中。
此命令行存在问题。我找不到命令解压档案的方法,因此较旧的档案可能会覆盖较新的档案。可以使用具有命令行开关的解压程序来解决此问题,该开关仅在较新的档案时才覆盖。我主要使用没有此类命令行选项的 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 或类似程序可以解决覆盖问题。
祝你好运。