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


86

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

原因是我有一个zip文件,该文件确实很大,有时我必须更新该zip文件中的一个xml。解压缩并重新压缩需要很长时间。因此,我只想通过一个脚本替换zip中的一个xml。我已经拥有检查我所拥有的xml更新的功能。

那么是否可以仅替换一个xml而无需解压缩和重新压缩呢?

抱歉,我会使用zip命令来执行类似操作,但问题是该脚本实际上是用于android手机的,而zip不是命令,我可以使用,很遗憾,我将其遗漏了。如果可以的话,我肯定会使用zip,但我只为droid解压缩,然后在busybox中有tar,但是tar无法满足我的需求


3
您可以将问题标题更改为更有意义的内容吗?
tokland 2011年

7
另外,问题可能是一两个句子。大约80%都是乱七八糟的。
暂停,直到另行通知。

Answers:


62

zip(1)

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

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


5
有人可以举个例子吗?我不了解zip命令的帮助。
古斯塔夫2015年

12
假设zip -r myfolder.zip myfolder您要压缩myfolder,如果要更新myfolder/otherfolder/myfile.txt,请继续编辑该文件并运行zip -r myfolder.zip myfolder/otherfolder/myfile.txt
eakkas

1
如果要替换的文件具有与要重新放置的文件不同的名称或相同的结构,该怎么办?
Fractaliste

2
@Fractaliste您必须使其具有相同的名称和结构;)
Hack5

72

我发现Linuxzip文件在替换zip中的单个文件时比较麻烦。jarJava Development Kit中的实用程序可能更容易。考虑WEB/web.xml在JAR文件(仅仅是zip文件)中更新的常见任务:

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

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


如果我只需要复制文件而不是创建WEB-INF具有该文件的导演怎么办?
伸出援手

同样在我的情况下,亲爱的旧“ jar”工具也成功了!谢谢!
bitfox

51

请尝试以下操作:

zip [zipfile] [file to update] 

一个例子:

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

2
这是最容易理解的例子,谢谢!
vatsug

2
考虑到您应该看到updating:而不是adding:如果要更新zip中的文件;否则,您将文件添加到zip中,而不是替换它。
Edenshaw

您是对的,我没有注意到。更新,谢谢!
WizardsOfWor

13

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

这是我所做的。创建了临时目录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存档中。


11

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


1

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

如果您的文件名为/myfiles/myzip.zip,那么您要做的就是

zip -f /myfiles/myzip.zip

0

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


0

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

示例: 替换(不考虑文件日期)MANIFEST.MFJAR文件中的文件。该/source/META-INF目录包含MANIFEST.MF您要放入jar(zip)的文件:

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

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

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

-2

是的,它有可能。

在基于Linux的系统上,只需安装zip即可,您可以在命令行中调用它。看看联机帮助页:http : //linux.die.net/man/1/zip

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.