Як конвертувати існуючі файли gz (gzip) у rsyncable


12

Я використовую rsync для резервного копіювання сховища, яке містить багато файлів gz, включаючи багато нових щодня. Резервне копіювання rsync протікає повільніше, ніж слід, оскільки ці файли gz не побудовані за допомогою опції --rsyncable gzip (що робить файли gz набагато більш сприятливими до rsync, не збільшуючи їх розмір чи впливаючи на їх сумісність). І я не можу виправити проблему під час створення, оскільки файли генеруються сценарієм python (rdiff-резервне копіювання), який використовує gzip-модуль python, і це не підтримує еквівалент gzip -rsyncable.

Тому перед запуском rsync я можу ідентифікувати будь-які нові файли gz у вихідних даних (тобто нові з моменту останнього запуску rsync). Тепер я хочу "повторно gzip" ці файли, щоб вони були gzipped у форматі rsyncable. Тоді я можу запустити rsync з оптимізованого джерела.

Я думаю, що це означає запуск кожного файлу через gunzip, а потім gzip --rsyncable, але я не дуже впевнений, як це зробити таким чином, що не загрожує втратою даних або метаданих. Пропозиції вдячно отримані.


8
Єдиний спосіб --rsyncableповинен мати значення, якщо файли змінюються між прогонами та rsyncнамагаються надсилати зміни. Нові файли не важливо, чи вони можуть бути синхронізуючими чи ні, тому що вони все одно rsyncповинні надсилати всі дані. Чи змінюються файли між запуском rsync?
Том Хант

Гарна думка. Насправді я не впевнений, я перевірю це. Припустимо поки що, так, вміст деяких gz-файлів змінюється.
gogoud

Найкраще, що я можу придумати, - це запустити скрипт, який перевіряє наявність нових файлів, скасовує їх, потім знову gzips --rsyncable.
Том Хант

Я погоджуюся, що якщо файли не змінюються, це не повинно бути проблемою. Зокрема, для швидкості переконайтесь, що ви пропускаєте контрольну суму на основі часу, зберігаючи рази, використовуючи -aпрапор. Крім того, у моїй версії gzip немає --rsyncableпрапора, але він поставляється з програмою під назвою, znewяка, ймовірно, може бути використана для того, що вам потрібно.
користувач3188445

2
Виявляється, як думав Том, файли gz, створені за допомогою rdiff-резервного копіювання, не змінюються після створення, і тому використання --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)
Stéphane Chazelas,

@ Stéphane Chazelas: Ви праві: якщо ця інформація є актуальною (вона ніколи не була актуальною для мене), ми її втрачаємо. Можливо, найкращим рішенням буде gunzip безпосередньо підтримувати це повторне стиснення. Він може передавати всі метадані внутрішньо.
Рауль Салінас-Монтеагудо

@ StéphaneChazelas Ви знаєте, що робити це без втрат?
Том Хейл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.