Bash 如何更新zip存档中的一个文件
是否可以在不解压缩的情况下替换zip文件中的文件删除旧文件添加新文件并重新压缩 原因是我有一个很大的zip文件,zip文件中有一个xml,我有时需要更新。拉开拉链并重新拉上拉链需要很长时间。因此,我希望能够通过脚本替换zip中的一个xml。我已经有了检查xml更新的工具 那么,是否可以在不解压缩和重新压缩的情况下替换一个xml 很抱歉,我会使用zip命令来做类似的事情,但问题是脚本实际上是针对android手机的,zip不是我可以使用的命令。很遗憾,我遗漏了这一点。如果可以的话,我肯定会使用zip,但我只有droid的解压功能,busybox中有tar,但tar不能满足我的需要: 当给定现有zip存档的名称时,zip将替换zip存档中同名的条目或添加新名称的条目 因此,只需像平常一样使用Bash 如何更新zip存档中的一个文件,bash,shell,zip,Bash,Shell,Zip,是否可以在不解压缩的情况下替换zip文件中的文件删除旧文件添加新文件并重新压缩 原因是我有一个很大的zip文件,zip文件中有一个xml,我有时需要更新。拉开拉链并重新拉上拉链需要很长时间。因此,我希望能够通过脚本替换zip中的一个xml。我已经有了检查xml更新的工具 那么,是否可以在不解压缩和重新压缩的情况下替换一个xml 很抱歉,我会使用zip命令来做类似的事情,但问题是脚本实际上是针对android手机的,zip不是我可以使用的命令。很遗憾,我遗漏了这一点。如果可以的话,我肯定会使用zi
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必须使其具有相同的名称和结构;)这是最容易理解的例子,谢谢!考虑到如果需要,您应该看到更新:
,而不是添加: