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

时间:2011-01-25 22:24:49

标签: bash shell zip

是否可以替换zip文件中的文件而不解压缩删除添加新文件并将其重新拉回的旧文件?

原因是我有一个zip文件非常大,zip文件中有一个xml,我有时需要更新。拉开拉链并重新拉链需要很长时间。所以我想通过脚本替换zip中的一个xml。我已经检查了xml的更新。

那么可以在没有解压缩和重新拉链的情况下替换一个xml吗?

抱歉,我会使用zip命令做这样的事情,但问题是脚本实际上是一个Android手机和zip不是一个命令我可以使用不幸抱歉我离开了。我肯定会使用zip肯定,如果我可以,但我只有解压缩机器人然后在busybox中有焦油,但焦油不能做我需要的

10 个答案:

答案 0 :(得分:62)

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

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

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

答案 1 :(得分:51)

来自zip(1)

  

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

所以只需像通常那样使用zip命令创建一个只包含那个文件的新.zip文件,除了你指定的.zip文件名将是现有存档。

答案 2 :(得分:33)

尝试以下方法:

zip [zipfile] [file to update] 

一个例子:

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

答案 3 :(得分:13)

我知道这是一个老问题,但我想做同样的事情。更新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存档。

答案 4 :(得分:10)

使用更新标记: -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%)

答案 5 :(得分:3)

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

答案 6 :(得分:1)

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

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

zip -f /myfiles/myzip.zip

答案 7 :(得分:0)

从ZIP存档结构的一侧 - 你可以更新zip文件而无需重新压缩它,你只需要跳过你需要替换的文件之前的所有文件,然后把你更新的文件,然后其余的文件。最后,您需要放置更新的centeral目录结构。 但是,我怀疑大多数常用工具都可以让你做到这一点。

答案 8 :(得分:0)

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

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

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

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

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

答案 9 :(得分:-2)

是的,可能。

基于linux的系统上的

只需安装zip,你可以在命令行中调用它。请查看联机帮助页:http://linux.die.net/man/1/zip

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