Как повторно сжать много zip-файлов на диске?

Как повторно сжать много zip-файлов на диске?

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

Есть ли способ (предпочтительно с помощью 7zip) повторно сжать все ZIP-файлы на диске, используя те же (наилучшие) настройки сжатия?

решение1

Ниже приведен скрипт, который я использовал в прошлом для решения аналогичной задачи со 100% успехом, который представляет собой чистую пакетную обработку с7Zipгде вы можете явно указать исходный каталог, это может быть буква диска или папка.

Это также позволяет вам явно указать начальный корневой временный каталог, а затем создать в нем новую папку, соответствующую имени zip-файла без расширения zip, а затем удалить ее после завершения7ZipОперации архивирования завершены для каждого zip-файлаДля /Фцикл повторяется и обрабатывается.

Сценарий

Вам просто нужно задать значения переменных Src=, ExtractDir=, и z7=такими, какие они необходимы в вашей среде, в верхней части скрипта, и все остальное будет работать.

Вы можете указать что угодно7Методы сжатия Zipвам нужно в конце команды %z7% a ~сразу после -aoaпереключателя, как -aoa -m<method_parameters>для ваших нужд.

Однако для запуска пакетного скрипта сохраните логику в файлТекстовый документна рабочем столе и т.д. как <something>.cmdиз текстового документафайл | сохранитьпараметры. После сохранения просто дважды щелкните по нему, чтобы выполнить логику (или щелкните правой кнопкой мыши, чтобы запустить от имени администратора), и подтвердите, что файлы были обработаны, как и ожидалось.

@ECHO ON
SET Src=X:\
SET ExtractDir=%Src%\tmpExtract007
SET z7="C:\Program Files\7-Zip\7z.exe"

FOR /F "usebackq tokens=*" %%a IN (`DIR /S /B /A-D "%Src%\*.zip"`) DO (
    IF NOT EXIST "%ExtractDir%\%%~Na" MD "%ExtractDir%\%%~Na"
    ECHO A | %z7% e "%%~Fa" -o"%ExtractDir%\%%~Na" -r
    %z7% a "%%~Fa" "%ExtractDir%\%%~Na\*" -aoa
    RD /Q /S "%ExtractDir%\%%~Na"
)
PAUSE
EXIT

Обратите внимание на символ ECHO A |перед %z7% e ~командой, чтобы указать ей перезаписать все существующие файлы, находящиеся в каталоге out, а не ждать, пока вы укажете ей сделать это и т. д.

введите описание изображения здесь

Также обратите внимание на использование переключателя -aoaв конце %z7% a ~команды, который сообщает ей о необходимости перезаписать все существующие файлы в архивируемом zip-файле, заменив все исходные файлы в нем без фактического удаления всего исходного zip-файла заранее. При необходимости это можно легко добавить в этот скрипт, добавив одну дополнительную строку IF EXIST "%%~Fa" DEL /Q /F "%%~Fa".


Дополнительные ресурсы

решение2

Вот простой скрипт для обычной командной строки ( cmd.exe), который может сделать это за вас:

set ZIP7="C:\Program Files\7-Zip\7z.exe"

for %z in (*.zip) do (
    mkdir tmp
    cd tmp
    %ZIP7% x ..\%z
    %ZIP7% a ..\%z.7z -r -mx9 *
    cd ..
    rmdir /s /q tmp
)

Сначала ZIP7определяется переменная с путем к 7z.exe. Затемforперебирает все zip-файлы в текущем каталоге. Каждый zip-файл извлекается в tmpкаталог, а затем повторно сжимается с помощью 7-Zip с максимальным сжатием ( -mx9опция).

Вы можете поместить эти команды в пакетный файл. В этом случае используйте double %в forпеременной -loop. То есть используйте %%zвместо %z.

решение3

Бесплатная программа ReZip выполнит эту работу:zipada55-bin-win32.zip. Для начала, rezip -comp -int archive.zipкоманда будет работать нормально без дополнительной установки. Для еще лучшего сжатия вам нужно будет скачать zip, 7z, kzip, advzip и запустить ReZip без этой -intопции. Полный набор опций командной строки:

Options:  -defl     : repack archive only with the Deflate
                        subformat (most compatible)
          -fast_dec : repack archive only with fast decompressing subformats
          -int      : use internal Zip-Ada algorithms only, no external call
          -touch    : set time stamps to now
          -lower    : set full file names to lower case
          -del_comm : delete comment
          -comp     : compare original and repacked archives (paranoid mode)
          -rs=n     : loop many times over a single compression approach
                        having randomization, and keep optimum when size is
                        stable after n attempts in a row

решение4

Напишите скрипт PowerShell, который найдет все zip-файлы на жестком диске, для каждого найденного zip-архива извлечет все файлы и снова согнет их в нужном формате.

Вы можете использовать встроенные функции ZIP или вызвать инструменты командной строки 7zip из PowerShell.

Связанный контент