Как прочесть файл-снапшот, который создаётся при инкрементальном дампировании tar?

Софт под Linux, разные программы, но только связанные с Linux

Модератор: /dev/random

Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Как прочесть файл-снапшот, который создаётся при инкрементальном дампировании tar?

Сообщение жучара »

Друзья! Вот так я инкрементально дампирую:
https://www.gnu.org/software/tar/manual/html_node/Incremental-Dumps.html#Incremental-Dumps

tar --create --file=archive.2.tar --listed-incremental=/var/log/usr.snar /usr

Как прочесть файл /var/log/usr.snar?- по другому: открыть его в человекочитаемом виде? Если прост открываешь cat там просто последовательность непонятная из цифр- да она и не обязана быть другой. Есть какие-нибудь способы- прежде всего у самого tar? В файле /var/log/usr.snar как минимум список архивируемых файлов и папок должен быть. Debian 11. Спасибо, кто откликнется.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Как прочесть файл-снапшот, который создаётся при инкрементальном дампировании tar?

Сообщение Bizdelnick »

Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Re: Как прочесть файл-снапшот, который создаётся при инкрементальном дампировании tar?

Сообщение жучара »

Вот это может помочь.
https://www.gnu.org/software/tar/manual/html_node/Fixing-Snapshot-Files.html#Fixing-Snapshot-Files

Для моих скромных нужд хватило прочтения снапшота:

Shell

$ cat foo.snar | bbe -e "s/\x00\x00\x00/\x0a\x0a/" | bbe -e "s/\x00/./" | bbe -e "i 35 \x0a\x0a"
$
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2652
ОС: Gentoo

Re: Как прочесть файл-снапшот, который создаётся при инкрементальном дампировании tar?

Сообщение ormorph »

Если для человеков, то вот основанный на этом на пайтон:
Spoiler

Shell

#!/usr/bin/env python
import os, sys, re

if len(sys.argv) < 2:
print("Missing argument")
sys.exit()

file = sys.argv[1]
if not os.path.isfile(file):
print("No such File: " + file)
sys.exit()

fd = open(file, 'rb')
#dump=b""
#while True:
# buf=fd.read()
# dump=dump + buf
# if buf == b"":
# break

dump=fd.read()

dump=re.sub(b'\x00\x00\x00', b'\n\n', dump)
dump=re.sub(b'\x00D', b'\n|____/', dump)
dump=re.sub(b'\x00Y', b'\n|____/', dump)
dump=re.sub(b'\x00', b'.', dump)
#dump=re.sub(b'^(.|\n){36}', re.match(b'^(.|\n){36}', dump)[0] + b'\n\n', dump)
dump=re.sub(b'^(.|\n){36}', b'', dump)
dump=re.sub(b'(\d{0,10})\.(\d{0,10})\.(\d{0,10})\.(\d{0,10})\.(\d{0,10})\.', b'', dump)
sys.stdout.buffer.write(dump)
fd.close()
Правится чисто регулярками.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2652
ОС: Gentoo

Re: Как прочесть файл-снапшот, который создаётся при инкрементальном дампировании tar?

Сообщение ormorph »

Хм, посмотрел как следует что выложил. Скрипт не корректно работает если сжимаемый головной каталог начинается на Y или D.
Это подправленная версия:
Spoiler

Shell

#!/usr/bin/env python
import os, sys, re

if len(sys.argv) < 2:
print("Missing argument")
sys.exit()

file = sys.argv[1]
if not os.path.isfile(file):
print("No such File: " + file)
sys.exit()

fd = open(file, 'rb')
dump=fd.read()

dump=re.sub(b'^(.|\n){36}', b'', dump)
dump=re.sub(b'\x00\x00\x00', b'\n\n', dump)
md=re.search(b'(\d{0,10})\x00(\d{0,10})\x00(\d{0,10})\x00(\d{0,10})\x00(\d{0,10})\x00', dump)[0]
md=re.sub(b'\x00', b'.', md)
md=re.sub(b'\.$', b': ', md)
dump=re.sub(b'(\d{0,10})\x00(\d{0,10})\x00(\d{0,10})\x00(\d{0,10})\x00(\d{0,10})\x00', md, dump)
dump=re.sub(b'\x00D', b'\n|____/', dump)
dump=re.sub(b'\x00Y', b'\n|____/', dump)
dump=re.sub(b'\x00', b'.', dump)
#dump=re.sub(b'(\d{0,10})\.(\d{0,10})\.(\d{0,10})\.(\d{0,10})\.(\d{0,10}): ', b'', dump)
sys.stdout.buffer.write(dump)
fd.close()
Дальше дело фантазии.
Хотя пардон, там есть ещё недоработка с первыми цифрами(они одни и те же). Это не мешало бы построчно разобрать. Но с байтами это не так просто.
Добавлено (09:50):
И последний вариант, с решённой последней проблемой.
Spoiler

Shell

#!/usr/bin/env python
import os, sys, re

if len(sys.argv) < 2:
print("Missing argument")
sys.exit()

file = sys.argv[1]
if not os.path.isfile(file):
print("No such File: " + file)
sys.exit()

fd = open(file, 'rb')
dump=fd.read()

dump=re.sub(b'^(.|\n){36}', b'', dump)
dump=re.sub(b'\x00\x00\x00', b'\n', dump)

list_dump=dump.split(b'\n')

for bytes in list_dump:
if bytes != b"":
md=re.search(b'(\d{0,10})\x00(\d{0,10})\x00(\d{0,10})\x00(\d{0,10})\x00(\d{0,10})\x00', bytes)[0]
md=re.sub(b'\x00', b'.', md)
md=re.sub(b'\.$', b': ', md)
buf=re.sub(b'(\d{0,10})\x00(\d{0,10})\x00(\d{0,10})\x00(\d{0,10})\x00(\d{0,10})\x00', md, bytes)
buf=re.sub(b'\x00D', b'\n|____/', buf)
buf=re.sub(b'\x00Y', b'\n|____/', buf)
# buf=re.sub(b'(\d{0,10})\.(\d{0,10})\.(\d{0,10})\.(\d{0,10})\.(\d{0,10}): ', b'', buf)
sys.stdout.buffer.write(buf + b'\n\n')

fd.close()
Теперь всё соответствует.
Спасибо сказали: