Как объединить / объединить ZIP-файлы?

21

За последние несколько месяцев я скопировал несколько папок с данными для архивирования файлов с недельными интервалами. Теперь я хотел бы объединить эти zip-файлы в один zip-файл, потому что большая часть содержимого существующих zip-файлов - это просто разные версии одних и тех же файлов данных.

Поэтому, если файл появляется в нескольких существующих zip-файлах, я бы хотел, чтобы самая новая версия была в новом создаваемом zip-файле. Конечно, если файл появляется только в одном существующем zip-файле, то я хочу, чтобы он был и в конечном zip-файле.

Я пытаюсь избежать необходимости разархивировать их одну за другой в рабочую папку, перезаписывая данные из старых файлов ZIP с данными из более новых файлов Zip, а затем заново упаковывать все в новый файл Zip.

Из того, что я понимаю, pkzip объединит сами zip-файлы, но есть ли надежный и быстрый бесплатный метод, о котором кто-нибудь может мне рассказать?

CChriss
источник
1
zipmerge для победы
Code Bling

Ответы:

7

Вам это не понравится, но: разархивировать все в рабочую папку в правильном порядке, а затем архивировать результат является наиболее эффективным способом.

в противном случае вы получите много потерянных циклов ЦП:

  • Предположим, что ваш результат идет в «first.zip»
  • каждый файл из «2.zip», «3.zip» и т. д. должен быть разархивирован, а затем снова заархивирован в «first.zip»
  • в «2.zip» существует файл «foobar.txt», а в «3.zip» существует другой файл «foobar.txt». слияние так, как вы хотите слить, приводит к «сжатию X раз»
  • Ток .zip находится в конце файла: вы добавляете больше содержимого (в середину
    .zip, обновляя файл в середине), и весь файл должен быть переписан

Итак, imho просто используйте « распаковать » Wiseley:

% mkdir all
% for x in *.zip ; do unzip -d all -o -u $x ; done
% zip -r all.zip all

Порядок распаковки важен, я не знаю, как устроены ваши почтовые имена, но сначала я извлеку самый новый zip-файл, опция un-zip -u перезаписывает только файлы, если они новее, или создает файлы, если нет уже здесь. в результате вы распакуете только самые новые файлы и заархивируете результат только один раз.

Акира
источник
Это может быть наиболее эффективным с точки зрения пользователя - но это не точно. Таблица файлов в zip-архиве фактически находится в конце, но вы можете произвольно записать файлы в конец любого zip-файла и затем записать новую таблицу файлов. Последняя запись всегда побеждает. Те, кто немного знаком со сценариями или программированием, могут выполнить весь этот процесс, не распаковывая и не сжимая никаких файлов, просто перемещая двоичные фрагменты и обновляя zip-таблицу.
Цезай
Фактически, вы можете просто объединить все zip-файлы в один файл (в том порядке, в котором вы хотите), а затем в конце записать новую запись файла, включающую только самые последние версии файлов. Это дает дополнительное преимущество, заключающееся в том, что zip-файл по-прежнему содержит все предыдущие версии файлов, которые можно восстановить при необходимости
caesay
«каждый файл из« 2.zip »,« 3.zip »и т. д. должен быть разархивирован, а затем снова заархивирован в« first.zip »» неверно. В zipmergeутилите слияния ZIP архивов без распаковки и повторного сжатия, например.
ZachB
Я использовал unzipping/ zippingи нет uncompress / decompress. Да, очевидно, можно взять одну запись 2.zip(сжатый BLOB-объект) и перенести ее в нее, first.zipи, таким образом, «сжатие» не должно выполняться. Но вы должны извлечь BLOB-объект из 2.zip, проверить наличие в TOC first.zip, если он там либо заменить существующую запись (что означает, что вы должны переписать весь файл в основном), либо добавить его в конце - и после этого вам нужно добавьте ток почтового индекса. Я не понимаю, как zipmergeможно добиться слияния zip-записей другим способом (без сжатия)
akira
-1 потому что есть гораздо более эффективные способы выполнить эту задачу, и ни одно из оправданий того, что это «самый эффективный способ», не имеет ни малейшего смысла. every file [...] has to be unzipped and then zipped again- нет, это то, что делает ваше решение. in '2.zip' exists a file 'foobar.txt' and in '3.zip' exists another file 'foobar.txt'. merging it the way you want to merge it leads to 'compress it X times'- нет, это не так. С чего бы это? you add more content [...] and the whole file has to be rewritten- нет, вы пишете вывод за один проход. Почему кто-то высказался против этого?
Бенг
4

Просто используйте опцию -g ZIP, где вы можете добавить любое количество ZIP-файлов в один (без извлечения старых). Это сэкономит вам значительное время.

Также взгляните на zipmerge

Christos
источник
4
-gдобавляет файлы в существующий почтовый индекс. это не объединяет их. Например: zip -g result.zip other.zipдобавит файл other.zipв result.zip . --grow Вырастить (добавить в) указанный zip-архив вместо создания нового. Если эта операция не выполняется, zip пытается восстановить архив в исходное состояние. Если восстановление не удалось, архив может быть поврежден. Этот параметр игнорируется , если нет существующего архива или когда по меньшей мере один член архива должны быть обновлены или deleted.`
Акира
2

https://linux.die.net/man/1/zipmerge :

zipmerge объединяет исходные zip-архивы source-zipс целевым zip-архивом target-zip. По умолчанию файлы в исходных zip-архивах перезаписывают существующие файлы с тем же именем в целевом zip-архиве.

imz - Иван Захарящев
источник
1

Я думал, что вы можете написать сценарий извлечения файлов во временный каталог.

Существует проблема с этой командной строкой. Я не смог найти способ распаковать архивы, поэтому старый архив может перезаписать новый. Эта проблема может быть преодолена с помощью расстегивающего молнии, который имеет переключатель командной строки, чтобы перезаписать только если новее. Я в основном использую 7-Zip, у которого нет такой опции командной строки.

Кроме того, эта команда необходима для всех файлов zip, находящихся в одном каталоге. Не проблема, если все почтовые индексы имеют уникальные имена. Тем не менее, команда может быть изменена в соответствии с вашей ситуацией.

for /f %f in ('dir /b *.zip') do "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoa

Чтобы изменить это на использование другой разархивирующей программы, просто замените ее "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoaлюбой командой, которую вы выполняете для каждого файла. Используйте %fв качестве заполнителя имя файла, который вы хотите распаковать.

Я пытался искать отшлифованное приложение, бесплатное или нет, но так и не нашел.

Надеюсь, это даст вам хороший старт, и WinZip или что-то подобное может решить проблему перезаписи.

Удачи.

Скотт МакКленнинг
источник
0

Если я правильно помню, pkzip был программой командной строки.

По-прежнему существует версия ZIP для командной строки, которая утверждает, что она совместима с pkzip.

Он называется Info-ZIP и должна быть версия для вашей ОС.

pavium
источник
Имеет ли он тот функционал, о котором я спрашиваю? Я не могу найти, где это перечисляет эту способность.
CChiss
1
Пакет Info-Zip делает файлы совместимыми с PKZip, но сами программы отличаются и, похоже, не включают опцию слияния.
CarlF
Хорошо, извините, я смог скомпилировать и запустить Info-Zip на рабочей станции Apollo под DOMAIN / OS много лет назад. Напомню, что в DOS / VMS / Unix и некоторых других, даже тогда, были разные функции. Я полагаю, что это могло развиваться дальше.
павильон
0

Ищите командную строку winzip в сети. Winzip имеет несколько версий инструментов командной строки, чтобы соответствовать любой версии winzip, которую вы, возможно, установили. Утилита командной строки WZZIP имеет опцию -f «освежить», которая будет заархивировать более новые файлы только из тех, которые соответствуют имени файла в zip-файле суммирования.

Используйте WZunzip, заключенный в оператор FOR, как показано выше, чтобы разархивировать один файл в каталог, а затем WZzip -f, чтобы добавить эти файлы в выходной zip-файл суммирования. Затем цикл FOR повторяется для работы со следующим входным файлом для вывода в единственный выходной файл суммирования. Порядок входных файлов не имеет значения, поскольку WZzip -f будет добавлять в выходной файл только в том случае, если входные данные новее, чем те, которые уже есть в выходном файле. Все файлы, которые не существуют в выходном файле, также будут добавлены. Затем вы можете разархивировать результат в папку, а затем снова сжать его, чтобы получить эффективно упакованный файл результатов. Вы даже можете сделать это автоматически после цикла FOR в конце пакетного файла.

eewiz
источник