如何覆盖现有的 zip 文件而不是在 Info-Zip 中更新它?

asa*_*ari 43 zip command-line

要像 tar 一样获取新的 zip 文件,我是否必须在执行rm foo.zip之前执行zip

$ mkdir foo; touch foo/bar
$ zip -r foo.zip foo
  adding: foo/ (stored 0%)
  adding: foo/bar (stored 0%)
$ rm foo/bar; touch foo/baz
$ zip -r foo.zip foo
  adding: foo/ (stored 0%)
  adding: foo/baz (stored 0%)
$ unzip -l foo.zip
Archive:  foo.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2011-10-27 07:49   foo/
        0  2011-10-27 07:49   foo/bar
        0  2011-10-27 07:49   foo/baz
---------                     -------
        0                     3 files
Run Code Online (Sandbox Code Playgroud)

Pau*_*aul 47

使用 -FS 选项“文件同步”

zip -FSr foo.zip foo
Run Code Online (Sandbox Code Playgroud)

这会将文件夹中的所有新文件添加到 zip,并从 zip 中删除不在文件夹中的所有文件。

  • 开关是`-FS`,而不是`-F` 和`-S`。这至少从 zip 3.0 开始就存在了。检查`man zip`。 (3认同)

mxx*_*xxk 7

使用该-FS选项(或删除旧 ZIP 文件)的替代方法是通过写入 stdout 并将其重定向到指定文件来覆盖现有 ZIPzip文件:

zip -r - foo >foo.zip

-r       : Add directory and its contents
-        : Instead of writing ZIP to a file, write to stdout
foo      : The directory to be zipped
>foo.zip : Redirect stdout to file foo.zip
Run Code Online (Sandbox Code Playgroud)

如果foo.zip存在,它将被 shell 重定向覆盖,这意味着您每次都会 100% 地获得一个全新的 ZIP 文件。