Вопрос или проблема
Я искал в Гугле, но не могу найти команду, которую использует утилита командной строки 7zip для создания инкрементных резервных копий. Может, кто-то сможет поделиться этой командой?
Спасибо
Кстати, я нашел эту ссылку: http://wmug.co.uk/wmug/b/sean/archive/2009/03/20/powershell-amp-7zip-incremental-backup-solution.aspx. Но кажется, что она касается дифференциальных резервных копий, хотя и написано, что это инкрементные.
Должно быть просто, используйте это для создания и инкрементного обновления архива:
7zr u -up0q3r2x2y2z1w2 {archive}.7z {path}
Эта страница предлагает справку по параметрам обновления.
Они переводятся следующим образом:
p0
– Если “Файл существует в архиве, но не соответствует шаблону”, то удалить файл из архива.q3
– Если “Файл существует в архиве, но не существует на диске”, то удалить файл из архива и удалить его из файловой системы при извлечении.r2
– Если “Файла нет в архиве, но он существует на диске”, то упаковать файл в архив.x2
– Если “Файл в архиве новее, чем файл на диске”, то “сжать файл с диска в новый архив”.y2
– Если “Файл в архиве старше файла на диске”, то упаковать более новый файл в архив.z1
– Если “Файл в архиве такой же, как файл на диске”, то повторно использовать упакованную версию файла.w2
– Если размер файла различен, то упаковать измененный файл в архив.
Обратите внимание, что только сжатие является инкрементным: то есть 7-Zip будет сжимать только обновления, повторно используя сжатые файлы, которые не были обновлены. Сам архив 7z все равно будет воссоздан 7-Zip.
(p.s. zpaq является хорошим примером первоклассной поддержки сохранения существующего архива.)
Если вы хотите сделать инкрементную резервную копию, вам нужно предоставить 7-zip список измененных файлов (с помощью -i@fileList
), и вам нужно будет как-то составить этот список. На архивном зеркале удаленного вопроса Офлайн инкрементная резервная копия через флешку вы можете найти команду Unix, использующую md5 подписи для создания fileList.
Операция обновления 7-zip позволяет создать второй архив с различиями (включая удаленные файлы), произошедшими с базового/основного архива. Это правильно называется дифференциальной резервной копией (как указано в самом вопросе).
Я нашел отличную статью по этой теме на WPCTips “Дифференциальные резервные копии с 7-zip” (архивировано). Они рекомендуют либо использовать графическую программу (Toucan), либо использовать этот рецепт для командной строки:
7z u {base archive.7z} -u- -"up0q3r2x2y2z0w2!{differential.7z}" {folder to archive}
Это немного отличается от 7zr u -up0q3r2x2y2z1w2 {archive}.7z {path}
, предложенного ArtemGr:
-u-
говорит о том, что основной архив не должен изменяться"-up0q3r2x2y2z0w2!{differential.7z}"
указывает цель для дифференциального архива и что делать с каждым файлом в каждом условии/состоянии: добавлять файлы, которые новые или измененные в файловой системе, удалять файлы, которые есть только в архиве 7zip, игнорировать остальные.
Обратите внимание, что символ “!” будет перехваченbash
, если его не экранировать.
На случай, если вам любопытно узнать о деталях этого криптичного p0q3r2x2y2z0w2
<state> | Состояние
p | Файл существует в архиве, но не соответствует шаблону. Существует, но не совпадает
q | Файл существует в архиве, но не существует на диске.
r | Файл не существует в архиве, но существует на диске.
x | Файл в архиве новее, чем файл на диске.
y | Файл в архиве старше файла на диске.
z | Файл в архиве такой же, как файл на диске
w | Невозможно определить, какой файл новее (временные метки одинаковы, размеры различны)
<action> | Описание
0 | Игнорировать файл (не создавать элемент в новом архиве для этого файла)
1 | Копировать файл (скопировать из старого архива в новый)
2 | Сжать (сжать файл с диска в новый архив)
3 | Создать анти-элемент (элемент, который удалит файл или директорию при извлечении). Эта функция поддерживается только в формате 7z.
Вы можете легко сделать инкрементную резервную копию, изменяя направление во времени. т.е. вы всегда храните последнюю резервную копию как полную копию и сохраняете дифференциальные файлы в прошлом.
# создайте дифференцию шагами в прошлое
7z u {base archive.7z} {folder to archive} -mx=9 -u- -up1q1r3x1y1z0w1!{decrement.7z}
# обновите архив до последних файлов
7z u {base archive.7z} {folder to archive} -mx=9 -up0q0x2
Базовый архив всегда содержит последнюю версию, и применяя “уменьшения” шаг за шагом, вы можете воссоздать старые версии. С небольшим скриптованием вы можете применить правильную нумерацию для уменьшительных файлов.
В пакетном файле с включенным delayedexpansion вам необходимо экранировать “!” двумя ^^ вот так
7z u {existing archive.7z} -u- -up0q3r2x2y2z0w2^^!{new differential.7z} {folder or files to archive}
Мне потребовалось немного времени, чтобы это заметить.
Ответ или решение
Инкрементальное резервное копирование с использованием 7-Zip
Для выполнения инкрементального резервного копирования с помощью командной утилиты 7-Zip вы можете использовать команду обновления (update), которая позволяет добавлять изменённые файлы в уже существующий архив. Вот пример команды:
7zr u -up0q3r2x2y2z1w2 {archive}.7z {path}
В этой команде используются следующие опции для инкрементного обновления:
- p0 – если файл существует в архиве, но не соответствует шаблону, он будет удалён из архива.
- q3 – если файл существует в архиве, но не существует на диске, он удаляется из архива и также удаляется из файловой системы при извлечении.
- r2 – если файл не существует в архиве, но существует на диске, он будет добавлен в архив.
- x2 – если файл в архиве новее, чем файл на диске, то файл будет сжиматься с диска в новый архив.
- y2 – если файл в архиве старее, чем файл на диске, будет добавлен новейший файл в архив.
- z1 – если файл в архиве совпадает с файлом на диске, будет использоваться уже упакованная версия файла.
- w2 – если размер файла отличается, изменённый файл будет добавлен в архив.
Следует отметить, что сжатие является инкрементальным: 7-Zip будет сжимать только обновления, повторно используя сжатые файлы, которые не были обновлены. Однако сам архив будет пересоздан.
Создание списка файлов для инкрементального резервного копирования
Чтобы выполнять инкрементальное резервное копирование, вы должны предоставить 7-Zip список изменённых файлов. Это можно сделать с помощью аргумента -i@fileList
, где fileList
– это файл, содержащий список ваших файлов.
Пример команды для создания списка файлов и их использования:
- Создайте файл
fileList.txt
, содержащий список файлов, которые были изменены с помощью утилиты, например, md5 для проверки изменений. - После этого выполните команду:
7z u {archive}.7z -i@fileList.txt
Создание дифференциального резервного копирования
Вы также можете защитить свой архив с помощью дифференциального резервного копирования, позволяющего создавать вторичный архив с отличиями от базового/основного архива. Это фактически охватывает изменения, включая файлы, которые были удалены. Для этого выполните:
7z u {base archive.7z} -u- -"up0q3r2x2y2z0w2!{differential.7z}" {folder to archive}
Здесь:
- -u- указывает, что основной архив не должен изменяться.
- "-up0q3r2x2y2z0w2!{differential.7z}" указывает имя целевого дифференциального архива и действия, которые нужно выполнить для каждого файла согласно его состоянию.
Примечание
Если вы хотите использовать !
в командной строке Bash, позаботьтесь о том, чтобы экранировать его, так как он может интерпретироваться как специальный символ.
Для создания резервной копии с возможностью отслеживания изменений вы можете использовать не только инкрементное, но и дифференциальное резервное копирование, чтобы хранить актуальные версии файлов, управляя архивами в соответствии с вашими потребностями.
Подводя итог, 7-Zip, как утилита для сжатия, предлагает необходимые механизмы для реализации как инкрементального, так и дифференциального резервного копирования, однако потребуется отдельная обработка файлов для получения списков модификаций.