У меня есть жесткий диск, на котором находится множество 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.