Создание разностных архивов средствами 7-zip; резервное копирование
Официальный сайт архиватора www.7-zip.org
Было время, когда сайт был недоступен, т.к. Роскомнадзор ради Телеграмма блокировал провайдера.
При скачивании на сторонних сайтах в комментариях жалобы, что работает с ошибками. Антиреклама? Скачиваемое на «левых» сайтах содержит ошибки или закладки?
Смотрел документацию: из командной строки можно делать разностные архивы.
В командной строке вводится старый архив, новый архив; архиватор читает каталоги и старый архив, и в новый архив пакуются только измененные файлы, пакуется метка удаления (anti-item), которая удалит файл в каталоге при распаковке.
Вот опция для создания разностных архивов
-u (Update options) switch
Specifies how to update files in an archive and (or) how to create new archives.
Syntax
-u[-]<action_set>[!{new_archive_name}] <action_set> ::= <state_action>... <state_action> ::= <state><action> <state> ::= p | q | r | x | y | z | w <action> ::= 0 | 1 | 2 | 3
Parameters
- dash (-)
- Disables any updates in the base archive.
- The term base archive means the archive assigned by "base_archive_name" on the command line. See Command line syntax for more details.
- {new_archive_name}
- Specifies the path name of the new archive to be created. All options in this switch will refer to this new archive.
- If not assigned, then all options in this switch will refer to the base archive of the command.
- <state>
- Specifies the state of a particular file to be processed.
<state> ::= p | q | r | x | y | z | w
- For each unique filename there are 6 variants of state:
-
<state>
State condition
File on Disk
File in Archive
p
File exists in archive, but is not matched with wildcard.
Exists, but is not matched
q
File exists in archive, but doesn't exist on disk.
Doesn't exist
Exists
r
File doesn't exist in archive, but exists on disk.
Exists
Doesn't exist
x
File in archive is newer than the file on disk.
Older
Newer
y
File in archive is older than the file on disk.
Newer
Older
z
File in archive is same as the file on disk
Same
Same
w
Can not be detected what file is newer (times are the same, sizes are different)
?
?
- <action>
- Specifies the action for a given <state>.
<action> ::= 0 | 1 | 2 | 3
- For each state you can specify one of the three variants of actions:
-
<action>
Description
0
Ignore file (don't create item in new archive for this file)
1
Copy file (copy from old archive to new)
2
Compress (compress file from disk to new archive)
3
Create Anti-item (item that will delete file or directory during extracting). This feature is supported only in 7z format.
Remarks
Any update command (such as a (Add), d (Delete), u (Update)) can be assigned in these terms.
The following table shows action sets for update commands.
command \ <state> |
p |
q (на диске нет, в архиве есть) - на диске удален |
r (есть на диске, нет в архиве) - новый файл |
x (в архиве новее); на диск возвращена старая версия - диверсия? |
y (на диске новее чем в архиве) |
z (одинаковый файл на диске и в архиве) |
w (одинаковый размер и дата, но разное содержимое) |
---|---|---|---|---|---|---|---|
d (Delete) |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
a (Add) |
1 |
1 |
2 |
2 |
2 |
2 |
2 |
u (Update) |
1 |
1
|
2 |
1 (РСА: Почему не 2?) |
2 |
1 |
2 |
Freshen |
1 |
1 |
0 |
1 |
2 |
1 |
2 |
Synchronize |
1 |
0 |
2 |
1 |
2 |
1 |
2 |
If you don't specify a !{new_archive_name} option, then all options will refer to the main archive (the archive assigned on the command line after the 7z command). If you specify !{new_archive_name} option, then 7-Zip also will create a new archive with the specified name and all options will refer to that new archive.
Multiple update switches are supported. 7-Zip can create any number of new archives during one operation.
By default, the action set for each new archive is assigned as the action set of the main command. There are 3 different action sets for commands: a (Add), d (Delete), u (Update). You can overload any <state_action> pair.
Time zone notes
If you change time zone (when you move your computer to another time zone or if there are clock changes for daylight saving in your zone), you can have some problems with update commands that depend from file's modification time. It's strongly recommended to use only file system that uses Coordinated Universal Time (UTC) and archive format that also uses UTC. In that case you will have no problems with time zone changes. Also it's recommended to use only UTC formats in other cases, for example, if you send files to someone in another time zone.
Also in some cases there are no problems, if both file system and archive format use local time, for example, FAT file system and ZIP format.
- UTC file systems: NTFS
- UTC archive formats: .zip with -mtc switch, 7z, tar, gzip2, iso, wim
- Local time file systems : FAT, FAT32
- Local time archive formats : rar, zip, cab
Examples
7z u c:\1\exist.7z -u- -up0q3x2z0!c:\1\update.7z *
creates a new archive update.7z and writes to this archive all files from current directory which differ from files in exist.7z archive. exist.7z archive will not be changed.
7z u c:\1\exist.7z -up0q3x2z0!c:\1\update.7z * -ms=off
creates a new archive update.7z and writes to this archive all files from the current directory which differ from files in exist.7z archive.
Note: the updating of solid .7z archives can be slow, since it can require some recompression.
Commands that can be used with this switch
a (Add), d (Delete), rn (Rename), u (Update),
Заметки по 7-zip 26.04.23
Вот файл bat, который архивирует текстовые файлы из каталога с подкаталогами
Сохранять bat-файл в кодировке ANSI.
Название можно любое читаемое, расширение BAT.
Запуск срабатывает из файлового менеджера.
Вот создается архив, куда добавляются текстовые файлы из заданного каталога
cd c:\Program Files\ИмяКаталогаГде7zip
7z.exe u c:\ИмяКаталога\arch.7z c:\ИмяКаталога\*.odt c:\ИмяКаталога\*.doc c:\ИмяКаталога\*.ods c:\ИмяКаталога\*.txt -r>>c:\...\report
cd c:\ИмяКаталога
Вот строка, которая к заданному базовому архиву сделает разностный.
7z.exe u c:\...\base.7z -u- -up0q3x2z0!c:\...\update1.7z c:\...\* -r
(если на диске файл старее, чем в архиве - добавляется в разностный архив;
(если на диске файл с той же датой-временем и размером, но отличающийся - он добавляется в разностный архив).
Насчет расширений:
- можно найти файлы "все";
- можно найти файлы с заданными расширениями
- нельзя найти только "файлы без расширений".
Потому что "так надо":
7-Zip doesn't use the system wildcard parser. 7-Zip doesn't follow the archaic rule by which *.* means any file.
7-Zip treats *.* as matching the name of any file that has an extension.
To process all files, you must use a * wildcard.
Ключ -r для добавления подкаталогов обязателен.
Есть еще какой-то хитрый ключ для рекурсии - разбираться!
-r0 Enable recurse subdirectories for item search only for wildcard names. ???
Все сообщения, что выводятся в консоли, при запуске из UnrealComander не выводятся. В сообщениях пишется: "Открытые в данный момент файлы не архивируются". И мало ли что еще! Поэтому добавлена строка, которая выводит все сообщения в файл report
>>c:\...\report
Пути к файлам можно указывать без кавычек
Можно обрабатывать СПИСКИ файлов, заданные в текстовых файлах!
Опции обновления
Стандартная команда U (update) не делает антиметку для удаленных файлов, так что надо ключ для антиметки делать вручную.
Когда выводится список файлов архива, там файлы с антиметкой будут ли помечены?
При создании разностного архива см:
1) если на диске нет файла, который есть в базовом архиве, тогда:
по умолчанию стоит q1 (взять из старого архива), а по нормальному надо ставить антиметку (q3).
2) если в архиве файл новее, чем на диске, тогда:
- по умолчанию x1, взять со старого архива;
- хочется такие странные случаи видеть, когда на диске версия старее, чем была на момент предыдущей архивации! По хорошему, это в логах должно выводиться.
- наверное, надо брать все-таки файл с диска, x2, иначе при восстановлении данных будет восстановлено не то, что было!
3) При создании разностных архивов, когда файлы с одинаковым временем и размером отличаются по содержимому - стандартно 7Z такие файлы добавляет в архив.
По хорошему, это в логах должно выводиться.
Хочется видеть список таких файлов при создании архива. Как сделать?
Сделать создание разностного архива с опцией добавлять ТОЛЬКО ТАКИЕ файлы, и посмотреть после, что туда попадет!
По ключу W ставим 2, по всем остальным ключам ставим 0. p0q0r0x0y0z0w2
Смотри сводную таблицу опций архивирования
<state> |
State condition |
File on Disk |
File in Archive |
d (Delete) |
a (Add) |
u (Update) |
Freshen |
Synchronize |
p |
File exists in archive, but is not matched with wildcard. |
|
Exists, but is not matched |
1 |
1 |
1 |
1 |
1 |
q |
File exists in archive, but doesn't exist on disk. |
Doesn't exist |
Exists |
0 |
1 |
1 (РСА Хочу 3) |
1 |
0 |
r |
File doesn't exist in archive, but exists on disk. |
Exists |
Doesn't exist |
0 |
2 |
2 |
0 |
2 |
x |
File in archive is newer than the file on disk. |
Older |
Newer |
0 |
2 |
1 |
1 |
1 |
y |
File in archive is older than the file on disk. |
Newer |
Older |
0 |
2 |
2 |
2 |
2 |
z |
File in archive is same as the file on disk |
Same |
Same |
0 |
2 |
1 |
1 |
1 |
w |
Can not be detected what file is newer (times are the same, sizes are different) |
? |
? |
0 |
2 |
2 |
2 |
2 |
Вот пример из инструкции как раз создает разностный архив, куда добавляются новые и измененные файлы, по удаленным файлам добавляется антиметка, и базовый архив остается неизменным.
7z u c:\1\exist.7z -u- -up0q3x2z0!c:\1\update.7z *
creates a new archive update.7z and writes to this archive all files from current directory which differ from files in exist.7z archive. exist.7z archive will not be changed.
Ситуации w2 хочется видеть.
Ситуации, когда x2 срабатывает (на диске версии старее, чем в архиве) - это хочется не просто помещать в разностный архив, а видеть такие ситуации!
Поэтому и программы резервного копирования, если они не делают отчетов о сравнении старого и нового снимка файлов, как это делается "двухпанельный" файловый менеджер - это проги "недоработанные".
Из таких прог надо распаковывать архивную версию в новый каталог, и после уже сравнивать версии?
Хорошо бы, чтобы архиватор выводил такую инфу в лог.
Заметки 26.11.23
1. Для команды U cтандартная опция Q настроена неправильно!
Если применить к исходному архиву, оно добавит все новые, измененые, перемещеные файлы, но удаленные файлы и перемещенные файлы в исходных каталогах в архиве оставались!
В примере к документации 7Z указан лучший вариант:
-u -up0q3x2z0
или
-u- -up0q3x2z0!c:\archive_new.7z
Здесь q3 ставит антиметки при создании добавочного архива.
А при обновлении исходного архива как сработает q0 — удаляет файлы, а q3 добавляет файлы-антиметки? Не понял этот момент! Но размеры каталогов в архиве после обновления и так и этак — одинаковы!
2. Свитчи для команды U задаются
или так:
-up1q0x2z1
// Обновляем заданный архив
или так
-u- -up1q0x2z1!c:\archive_new.7z
// Базовый архив не изменяем, и создаем новый (добавочный) архив c:\archive_new.7z
// Тут неожиданно надо два раза писать "-u".
// Вариант "-u-p1q0x2z1!...." не работает
РСА 7-zip хорош, чтобы время от времени делать резервные копии.
При инкрементном копировании в новый архив записываются только изменения файлов! Если в больших файлах меняются малые фрагменты, то объем дополнительных архивов будет мизерный!
7Z инкрементные архивы не создает? Он создаст базовый архив, а в добавочный архив он заново запишет все новые, измененные файлы +антиметки по удаленным файлам)?
Для инкрементного резервного копирования есть платные, и есть проверенные временем open-source бесплатные программы резервного копирования (например, Duplicati). Для регулярного автоматического резервного копирования на FTP-сервер лучше использовать Duplicati.
Разработчики Duplicati просят оказать им поддержку в 10 евро для физ лиц и 100 евро для организаций, можно криптовалютой! Вот они, подвижники! Вот они, святые бессеребреники!
Смотри материалы по резервному копированию тут: https://romin.org