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

是否可以replace压缩文件中的文件而不解压缩删除旧文件添加新文件并重新压缩它?

原因是我有一个zip文件,这是真的很大有一个XML文件,我有时需要更新的zip文件。 解压缩并重新压缩需要很长时间。 所以我想只能通过一个脚本来replacezip中的一个xml。 我已经有了检查我有更新的XML。

那么是否有可能只取代一个XML而不解压缩和重新压缩?

对不起,我会使用zip命令来做这样的事情,但问题是脚本实际上是一个Android手机和邮编不是一个命令,我可以使用不幸的是,我离开了这一点。 如果可以的话,我会绝对使用zip,但我只有解压缩的机器人,然后有焦油busybox但焦油不做我所需要的

从zip(1) :

当给定一个现有的压缩档案的名称时,zip将replace压缩档案中相同名称的条目或者添加新名称的条目。

因此,只需使用zip命令就可以创build一个仅包含一个文件的新.zip文件,除了指定的.zip文件名将是现有的文件。

我发现Linux zip文件在zip中replace单个文件非常麻烦。 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 )的目录的path。

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

这是我做的。 创build临时目录abc 。 复制file.zipabc并提取该目录中的文件。 我编辑了我想编辑的文件。 然后在abc中运行以下命令

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

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

尝试以下操作:

 zip [zipfile] [file to update] 

一个例子:

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

使用更新标志: -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 <-- NEW FILE 

用法

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

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

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

如果你的文件被命名为/myfiles/myzip.zip,你所要做的就是

 zip -f /myfiles/myzip.zip 

从ZIP存档结构的一面 – 你可以更新压缩文件,而不必重新压缩它,你只需要跳过所有需要replace的文件的文件,然后把你的更新的文件,然后其余的文件。 最后,你需要把更新的中心目录结构。 但是,我怀疑最常用的工具可以让你做到这一点。

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

示例:replace(无论文件date)JAR文件中的MANIFEST.MF文件。 /source/META-INF目录包含要放入jar (zip)的MANIFEST.MF文件:

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

只有更新(如果来源较旧,则不会replace目标)

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

是的,可能的。

在基于Linux的系统上只安装zip,你可以在命令行中调用它。 看看这个手​​册: http : //linux.die.net/man/1/zip

但以我个人的经验来看,如果可能的话,压缩并不是那么重要,用普通的tar文件和tar可以更好地工作。