如何更新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.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归档文件中。
尝试以下操作:
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可以更好地工作。