Как перезаписать существующий zip-файл вместо его обновления в Info-Zip?

30

Чтобы получить новый zip-файл, как это делает tar, мне нужно выполнить 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
азари
источник

Ответы:

32

Используйте опцию -FS для синхронизации файлов

zip -FSr foo.zip foo

Это добавит любые новые файлы в папке в zip-архив и удалит все файлы из zip-файла, которых нет в папке.

Павел
источник
Какая версия zip имеет эту опцию? Моя zip-команда не распознает "-S"
Jayan
2
Переключатель -FSнет -Fи -Sвместе. Это было там с zip 3.0 по крайней мере. Проверьте man zip.
Пол
Как определяется «новый файл»? Изменения в размере файла, дата изменения, оба? Просто любопытно
Мозелей
Это просто работает Zip 3.0и не работает Zip 2.32(не удалял старые файлы в zip-пакете)
Наби КАЗ
Вы имеете в виду -FS -r, верно?
Лавина 1
0

Альтернативой использованию -FSопции (или удалению старого ZIP-файла) и буквальной перезаписи существующего ZIP-файла является запрос zipвывода в stdin и перенаправление вывода в файл по вашему выбору:

zip -r - foo >foo.zip

Если файл foo.zip существует, он будет перезаписан перенаправлением оболочки, что означает, что вы будете получать новый новый файл ZIP в 100% случаев каждый раз,

mxxk
источник
Вы имеете в виду вывод на стандартный вывод
flarn2006