18

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

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

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

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

7 ответов7

5

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

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

  • Предположим, что ваш результат идет в «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, но сначала я извлеку самый новый файл zip, опция -u 'unzip перезаписывает только файлы, если они новее, или создает файлы, если нет уже здесь. в результате вы распакуете только самые новые файлы и заархивируете результат только один раз.

4

Возможно, это не то, что вам нужно, но бесплатный инструмент сборки Ant включает возможность объединения Zip-файлов.

https://ant.apache.org/manual/Tasks/zip.html

4

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

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

1

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

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

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 и должна быть версия для вашей ОС.

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .