如何更新 zip 存档中的一个文件

Posted

技术标签:

【中文标题】如何更新 zip 存档中的一个文件【英文标题】:How to update one file in a zip archive 【发布时间】:2011-06-15 12:48:48 【问题描述】:

是否可以在不解压缩删除旧文件的情况下替换 zip 文件中的文件添加新文件并重新压缩?

原因是我有一个非常大的 zip 文件,有时我必须更新 zip 文件中的一个 xml。解开拉链并重新拉上拉链需要很长时间。因此,我希望能够通过脚本替换 zip 中的一个 xml。我已经检查了我拥有的 xml 的更新。

那么是否可以只替换一个xml而不解压缩和重新压缩?

对不起,我会使用 zip 命令来做类似的事情,但问题是脚本实际上是用于 android 手机的,而 zip 不是我可以使用的命令,很抱歉,我把它遗漏了。如果可以的话,我肯定会使用 zip,但我只有 unzip 用于 droid,然后在busybox 中有 tar,但 tar 不能满足我的需要

【问题讨论】:

你能把问题的标题改成更有意义的吗? 另外,问题可能是一两句话。其中大约 80% 是漫无目的的。 【参考方案1】:

来自zip(1):

当给定现有 zip 存档的名称时,zip 将替换 zip 存档中同名的条目或添加新名称的条目。

因此,只需像往常一样使用zip 命令来创建一个仅包含该文件的新 .zip 文件,但您指定的 .zip 文件名将是现有存档。

【讨论】:

有人可以举个例子吗?我不明白 zip 命令的帮助。 假设您使用zip -r myfolder.zip myfolder 压缩了我的文件夹,如果您想更新myfolder/otherfolder/myfile.txt,请继续编辑文件并运行zip -r myfolder.zip myfolder/otherfolder/myfile.txt 如果要替换的文件与要替换的文件的名称和结构不同怎么办? @Fractaliste 你必须让它具有相同的名称和结构;)【参考方案2】:

是的,有可能。

在基于 linux 的系统上,只需安装 zip,您就可以在命令行中调用它。看看手册页:http://linux.die.net/man/1/zip

但以我个人的经验,如果可能并且压缩不是那么重要,这对普通的 tar 文件和 tar 效果更好。

【讨论】:

【参考方案3】:

我发现 Linux zip 文件对于替换 zip 中的单个文件很麻烦。 Java Development Kit 中的jar 实用程序可能更简单。考虑在 JAR 文件(只是一个 zip 文件)中更新 WEB/web.xml 的常见任务:

jar -uf path/to/myapp.jar -C path/to/dir WEB-INF/web.xml

这里,path/to/dir 是包含WEB-INF 目录(又包含web.xml)的目录的路径。

【讨论】:

如果我只需要复制文件而不是创建一个包含该文件的导演WEB-INF 会怎样。 在我的情况下,亲爱的老“jar”实用程序也成功了!谢谢! 这个性能怎么样?它是否只是为每个文件和新文件创建一个新存档并替换原始文件。还是它实际上做了一些就地魔法?【参考方案4】:

我知道这是个老问题,但我也想这样做。更新 zip 存档中的文件。以上答案都没有真正帮助我。

这就是我所做的。创建了临时目录abc。将file.zip 复制到abc 并解压缩该目录中的文件。我编辑了我想要编辑的文件。 然后在abc 中运行以下命令

user@host ~/temp/abc $ zip -u file.zip
updating: content/js/ (stored 0%)
updating: content/js/moduleConfig.js (deflated 69%)

-u 开关将查找更改/新文件并将添加到 zip 存档中。

【讨论】:

【参考方案5】:

尝试以下方法:

zip [zipfile] [file to update] 

一个例子:

$ zip test.zip test/test.txt
updating: test/test.txt (stored 0%)

【讨论】:

这个是最容易理解的,感谢例子,谢谢! 如果要更新 zip 中的文件,请注意应该看到 updating: 而不是 adding:;否则,您将文件添加到 zip,而不是替换它。 你说得对,我没有注意到这一点。已更新,谢谢!【参考方案6】:

从 ZIP 存档结构方面 - 您可以在不重新压缩的情况下更新 zip 文件,您只需要跳过您需要替换的文件之前的所有文件,然后放入更新的文件,然后是其余的文件。最后,您需要放置更新后的中心目录结构。 但是,我怀疑大多数常用工具都可以让您做到这一点。

【讨论】:

【参考方案7】:

您可以使用: zip -u file.zip 路径/file_to_update

【讨论】:

【参考方案8】:

使用更新标志:-u

例子:

zip -ur existing.zip myFolder

此命令将压缩并将myFolder(及其内容)添加到existing.zip


高级用法:

更新标志实际上将传入文件与现有文件进行比较,并将添加新文件或更新现有文件。

因此,如果您想在 zip 文件中添加/更新特定子目录,只需根据需要更新源,然后使用 -u 标志重新压缩整个源。只有更改的文件会被压缩。

如果您无权访问源文件,您可以解压缩 zip 文件,然后更新所需文件,然后使用 -u 标志重新压缩。同样,只会压缩更改的文件。

例子:

原始来源结构


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt

更新的源结构


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt 
│   │   ├── logs4.txt &lt-- NEW FILE 

用法

$ zip -ur existing.zip ParentDir 
> updating: ParentDir/ChildDir/Logs (stored 0%)
>   adding: ParentDir/ChildDir/Logs/logs4.txt (stored 96%)

【讨论】:

谢谢,这行得通。可能看起来有点不寻常的练习,但我需要创建一个干净的文件夹来完成这项工作,将 zip 复制到其中,然后在其中创建一系列嵌套的空目录,其名称与 zip 中包含的目录相同我要替换的文件!但它起作用了,正如我在unzip -l 时替换文件的新文件大小所证明的那样【参考方案9】:

还有 -f 选项可以刷新 zip 文件。它可用于更新自 zip 生成以来已更新的所有文件(假设它们在 zip 文件的树结构中位于同一位置)。

如果您的文件名为 /myfiles/myzip.zip,您只需

zip -f /myfiles/myzip.zip

【讨论】:

【参考方案10】:

7zip (7za) 可以很好地用于添加/更新文件/目录:

示例: 在 JAR 文件中替换(无论文件日期如何)MANIFEST.MF 文件。 /source/META-INF 目录包含您要放入 jar (zip) 的 MANIFEST.MF 文件:

7za a /tmp/file.jar /source/META-INF/

仅更新(如果源较旧,则不替换目标)

7za u /tmp/file.jar /source/META-INF/

【讨论】:

以上是关于如何更新 zip 存档中的一个文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Bash 中使用 ZIP 存档

我如何更新此代码以第二次运行但仅在已解压缩的 zip 存档上运行?

java exe 怎么更新jar包

python/zip:如果提供了文件的绝对路径,如何消除 zip 存档中的绝对路径?

如何在不解压缩的情况下列出 zip 存档中的文件?

将文件添加到存档时不要修改文件的编辑日期