How to overwrite existing zip file instead of updating it in Info-Zip?

To obtain a fresh zip file just like as tar does, do I have to perform rm foo.zip before executing 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

Use the -FS option to "file sync"

zip -FSr foo.zip foo

This will add any new files in the folder to the zip, and delete any files from the zip that aren't in the folder.


An alternative to using the -FS option (or deleting the old ZIP file), is to overwrite the existing ZIP file by having zip write to stdout and redirecting it to the designated file:

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

If foo.zip exists, it will be overwritten by shell redirection, meaning you'll get a fresh new ZIP file 100% of the time, every time. 🙂