Как преобразовать существующие файлы gz (gzip) в rsyncable

12

Я использую rsync для резервного копирования репозитория, который содержит много файлов gz, включая много новых, каждый день. Резервное копирование rsync выполняется медленнее, чем следовало бы, потому что эти файлы gz не создаются с помощью опции --rsyncable gzip (которая делает файлы gz гораздо более «дружественными к rsync» без значительного увеличения их размера или влияния на их совместимость). И я не могу решить проблему во время создания, потому что файлы генерируются скриптом python (rdiff-backup), который использует модуль gzip python, и это не поддерживает эквивалент grsip --rsyncable.

Поэтому перед запуском rsync я могу определить любые новые файлы gz в исходных данных (т.е. новые с момента последнего запуска rsync). Теперь я хочу повторно скопировать эти файлы, чтобы они были сжаты в формате rsyncable. Затем я могу запустить rsync из оптимизированного источника.

Я думаю, что это означает запуск каждого файла через gunzip и затем gzip --rsyncable, но я не слишком уверен, как сделать это так, чтобы не потерять данные или метаданные. Предложения с благодарностью приняты.

gogoud
источник
8
Единственный способ, который --rsyncableдолжен иметь значение, - это если файлы меняются между запусками и rsyncпытается отправить изменения. Новые файлы не заботятся о том, являются ли они Rsyncable или нет, потому rsyncчто все равно должны отправлять все данные. Изменяются ли файлы между запусками rsync?
Том Хант
Хорошая точка зрения. На самом деле я не уверен, я проверю это. Давайте пока предположим, что да, содержимое некоторых файлов gz изменилось.
Гогуд
Лучшее, что я могу придумать, - это запустить скрипт, который проверяет наличие новых файлов, распаковывает их, а затем снова сжимает --rsyncable.
Том Хант
Я согласен, что если файлы не меняются, это не должно быть проблемой. В частности, для скорости убедитесь, что вы пропускаете контрольную сумму, основанную на времени, сохраняя время, используя -aфлаг. Кроме того, моя версия gzip не имеет --rsyncableфлага, но она поставляется с программой, znewкоторая может быть использована для того, что вам нужно.
user3188445 20.11.15
2
Оказывается, что, как подумал Том, gz-файлы, созданные rdiff-backup, не меняются после создания, поэтому их использование --rsyncableне поможет. Я надеялся на строку кода или короткий скрипт, который бы безопасно распаковывал архив gz и перепаковывал его, используя --rsyncable. Но сейчас это просто академический вопрос для меня.
gogoud

Ответы:

1
#! /bin/bash

set -euo pipefail

##  TOKEN's creation time marks the time since last recompression
TOKEN=.lastRecompression   

if [ -f ${TOKEN} ]
then
    find -name '*.gz' -cnewer "${TOKEN}"
else
    # Process all compressed files if there is no token.
    find -name '*.gz'
fi | while read f
do
    # Do it in two steps
    gunzip < "$f" | gzip --rsyncable > "$f.tmp"

    # Preserve attributes
    cp "$f" "$f.tmp" --attributes-only

    # and rename atomically.
    # set -e ensures that a problem in the previous step 
    # will stop the full script. 
    mv -v "$f.tmp" "$f"
done

# Update the token
touch ${TOKEN}
Рауль Салинас-Монтеагудо
источник
1
Поступая так gunzip | gzip, вы теряете несжатое имя и время, сохраненные в файле gz (и видимые вместе с ним gzip -vNl)
Стефан Шазелас,
@ Стефан Шазелас: Вы правы: если эта информация актуальна (она никогда не была актуальна для меня), мы теряем ее. Возможно, лучшим решением было бы Gunzip напрямую поддерживать это повторное сжатие. Он может передавать все метаданные внутри.
Рауль Салинас-Монтеагудо
@ StéphaneChazelas Вы знаете кого-нибудь, чтобы сделать это без потерь?
Том Хейл