如何更新压缩文件中的一个文件

有没有可能在不解压缩的情况下替换压缩文件中的文件?

要更新的文件是一个 XML 文件,它位于一个巨大的 zip 归档文件中。要更新这个 XML 文件,我必须解压缩存档文件,删除旧的 XML 文件,添加新的文件,然后重新压缩。这需要相当长的时间。因此希望能够通过脚本替换那个 XML。我已经有了一个检查 XML 更新的程序。

使用 zip 命令
对不起,我会使用 zip 命令来做这样的事情,但问题是脚本实际上是一个 Android 手机和 zip 不是一个命令,我可以使用不幸的是,对不起,我离开了。如果可以的话,我肯定会用 zip,但是我只有 droid 的 unzip,还有 busybox 中的 tar,但是 tar 不能满足我的需要

143185 次浏览

来自 zip(1):

当给定现有的 zip 归档文件的名称时,zip 将替换 zip 归档文件中具有相同名称的条目,或者为新名称添加条目。

因此,只需像通常那样使用 zip命令就可以创建一个新的。只包含该文件的 zip 文件,除了。指定的 zip 文件名将是现有的归档文件。

是的,有可能。

在基于 linux 的系统上,只要安装 zip,就可以在命令行中调用它。看看页面: http://linux.die.net/man/1/zip

但是根据我个人的经验,如果可能的话,压缩并不那么重要,对于普通的 tar 文件和 tar,这种方法会更好。

我发现 Linux zip文件对于在 zip 中替换单个文件非常麻烦。来自 JDK 的 jar实用程序可能更容易。考虑一下在 JAR 文件(只是一个 zip 文件)中更新 WEB/web.xml的常见任务:

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

Here, path/to/dir is the path to a directory containing the WEB-INF directory (which in turn contains web.xml).

我知道这是个老问题,但我也想这么做。更新压缩文件中的文件。以上的答案都没有真正帮到我。

我是这么做的。创建临时目录 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-u file.zip path/file _ to _ update

使用 update 标志: -u

例如:

zip -ur existing.zip myFolder

这个命令将压缩并将 myFolder(及其内容)添加到 existing.zip


高级用法:

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

因此,如果您希望在 zip 文件中添加/更新特定的子目录,只需根据需要更新源代码,然后使用 -u标志重新压缩整个源代码。只有更改后的文件才会被压缩。

如果不能访问源文件,可以解压缩压缩文件,然后更新所需的文件,然后使用 -u标志重新压缩。同样,只有更改后的文件将被压缩。

例如:

原始来源结构


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt

Updated Source Structure


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

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

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

zip -f /myfiles/myzip.zip

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

在 JAR 文件中替换 MANIFEST.MF文件(不管文件日期)。/source/META-INF目录包含要放入 jar(zip)中的 MANIFEST.MF文件:

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

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

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