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

Bash 如何更新zip存档中的一个文件,bash,shell,zip,Bash,Shell,Zip,是否可以在不解压缩的情况下替换zip文件中的文件删除旧文件添加新文件并重新压缩 原因是我有一个很大的zip文件,zip文件中有一个xml,我有时需要更新。拉开拉链并重新拉上拉链需要很长时间。因此,我希望能够通过脚本替换zip中的一个xml。我已经有了检查xml更新的工具 那么,是否可以在不解压缩和重新压缩的情况下替换一个xml 很抱歉,我会使用zip命令来做类似的事情,但问题是脚本实际上是针对android手机的,zip不是我可以使用的命令。很遗憾,我遗漏了这一点。如果可以的话,我肯定会使用zi

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

原因是我有一个很大的zip文件,zip文件中有一个xml,我有时需要更新。拉开拉链并重新拉上拉链需要很长时间。因此,我希望能够通过脚本替换zip中的一个xml。我已经有了检查xml更新的工具

那么,是否可以在不解压缩和重新压缩的情况下替换一个xml

很抱歉,我会使用zip命令来做类似的事情,但问题是脚本实际上是针对android手机的,zip不是我可以使用的命令。很遗憾,我遗漏了这一点。如果可以的话,我肯定会使用zip,但我只有droid的解压功能,busybox中有tar,但tar不能满足我的需要:

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

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

是的,这是可能的

在基于linux的系统上,只需安装zip,就可以在命令行中调用它。请查看手册页:


但根据我个人的经验,如果可能的话,压缩也不是很重要,那么使用普通tar文件和tar会更好。

我发现Linux
zip文件对于替换zip中的单个文件来说很麻烦。Java开发工具包中的
jar
实用程序可能更简单。考虑在JAR文件(这只是一个zip文件)中更新<代码> Web/Web.XML/COD>的任务:


这里,
path/to/dir
是指向包含
WEB-INF
目录的目录的路径(该目录又包含
WEB.xml

我知道这是个老问题,但我也想这么做。更新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存档。

请尝试以下操作:

zip [zipfile] [file to update] 
例如:

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

从ZIP存档结构的角度来看,您可以更新ZIP文件而无需重新压缩,您只需跳过需要替换的文件之前的所有文件,然后放入更新的文件,然后放入其余文件。最后,您需要将更新后的centeral目录结构放入。 但是,我怀疑大多数常用工具是否允许您这样做。

您可以使用:
zip-u file.zip路径/file-u-to-u-update

使用更新标志:
-u

例如:

zip-ur existing.zip myFolder

此命令将压缩并将
myFolder
(及其内容)添加到
现有.zip


高级用法:

update标志实际上将传入文件与现有文件进行比较,并将添加新文件或更新现有文件

因此,如果要在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%)
更新的源结构


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%)

父目录
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── 日志
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt
│   │   ├── logs4.txt<--新文件
用法


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-ur existing.zip ParentDir
>更新:ParentDir/ChildDir/Logs(存储0%)
>添加:ParentDir/ChildDir/Logs/logs4.txt(存储96%)

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

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

zip -f /myfiles/myzip.zip
7zip
(7za)可用于添加/更新文件/目录:

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

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


你能把问题的标题改成更有意义的吗?另外,问题可能是一两句话。大约80%的内容是漫无边际的。有人能举个例子吗?我不理解zip命令的帮助。假设您使用
zip-r myfolder.zip myfolder
压缩了myfolder,如果您想更新
myfolder/otherfolder/myfile.txt
,继续编辑文件并运行
zip-r myfolder.zip myfolder/otherfolder/myfile.txt
如果要替换的文件与要重新计算的文件的名称或结构不同,如何执行此操作?@Fractaliste必须使其具有相同的名称和结构;)这是最容易理解的例子,谢谢!考虑到如果需要,您应该看到
更新:
,而不是
添加: