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

use*_*732 73 bash shell zip

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

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

那么可以在不解压缩和重新压缩的情况下更换一个xml吗?

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

cay*_*ann 64

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

jar -uf path/to/myapp.jar -C path/to/dir WEB-INF/web.xml
Run Code Online (Sandbox Code Playgroud)

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

  • 这有什么表现呢?它是否只是用每个文件和新文件创建一个新存档并替换原始文件。或者它真的做了一些就地魔法吗? (3认同)

Ple*_*and 52

来自zip(1):

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

因此,只需zip像通常那样使用该命令来创建仅包含该文件的新.zip文件,但您指定的.zip文件名将是现有存档.

  • 如果你想更新`myfolder/otherfolder/myfile.txt`,请使用`zip -r myfolder.zip myfolder`压缩myfolder,继续编辑文件并运行`zip -r myfolder.zip myfolder/otherfolder/myfile .txt` (10认同)
  • 请问有人举个例子吗?我不明白zip命令的帮助. (3认同)
  • @Fractaliste 你必须让它具有相同的名称和结构;) (2认同)

use*_*048 37

请尝试以下方法:

zip [zipfile] [file to update] 
Run Code Online (Sandbox Code Playgroud)

一个例子:

$ zip test.zip test/test.txt
updating: test/test.txt (stored 0%)
Run Code Online (Sandbox Code Playgroud)

  • 考虑到如果您想更新 zip 中的文件,您应该看到 `updating:` 而不是 `adding:`;否则,您将文件添加到 zip,而不是替换它。 (3认同)
  • 感谢这个例子,这是最容易理解的,谢谢! (2认同)

tra*_*nal 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%)
Run Code Online (Sandbox Code Playgroud)

-u switch将查找已更改/新文件,并将添加到zip存档.


Eth*_*der 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
Run Code Online (Sandbox Code Playgroud)

更新的源结构


ParentDir
??? file1.txt
??? file2.txt
??? ChildDir
?   ??? file3.txt
?   ??? Logs
?   ?   ??? logs1.txt
?   ?   ??? logs2.txt
?   ?   ??? logs3.txt 
?   ?   ??? logs4.txt <-- NEW FILE 
Run Code Online (Sandbox Code Playgroud)

用法

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


小智 5

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