6

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

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

4 ответа4

5

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

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

скрипт

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

Вы можете указать любые методы сжатия 7Zip, которые вам нужны, в конце команды %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" .


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

4

Вот простой скрипт для обычной командной строки (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 .

1

Бесплатное программное обеспечение 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
0

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

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

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