是否可以替换zip文件中的文件而不解压缩删除添加新文件并将其重新拉回的旧文件?
原因是我有一个zip文件非常大,zip文件中有一个xml,我有时需要更新。拉开拉链并重新拉链需要很长时间。所以我想通过脚本替换zip中的一个xml。我已经检查了xml的更新。
那么可以在没有解压缩和重新拉链的情况下替换一个xml吗?
抱歉,我会使用zip命令做这样的事情,但问题是脚本实际上是一个Android手机和zip不是一个命令我可以使用不幸抱歉我离开了。我肯定会使用zip肯定,如果我可以,但我只有解压缩机器人然后在busybox中有焦油,但焦油不能做我需要的
答案 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)
只需安装zip,你可以在命令行中调用它。请查看联机帮助页:http://linux.die.net/man/1/zip
但根据我的个人经验,如果可能并且压缩不是那么重要,这对普通的tar文件和tar来说效果会更好。