Bagaimana mengkonversi file gz (gzip) yang ada ke rsyncable

12

Saya menggunakan rsync untuk membuat cadangan repositori yang berisi banyak file gz termasuk banyak yang baru setiap hari. Cadangan rsync berlangsung lebih lambat dari yang seharusnya karena file-file gz ini tidak dibangun dengan opsi --rsyncable gzip (yang membuat file-file gz jauh lebih 'ramah-rsync-friendly' tanpa meningkatkan ukurannya secara signifikan atau memengaruhi kompatibilitasnya). Dan saya tidak dapat memperbaiki masalah pada saat pembuatan karena file-file tersebut dihasilkan oleh skrip python (rdiff-backup) yang menggunakan modul gzip python dan ini tidak mendukung yang setara dengan gzip --rsyncable.

Jadi sebelum menjalankan rsync saya dapat mengidentifikasi file gz baru dalam data sumber (yaitu baru sejak terakhir kali rsync dijalankan). Sekarang saya ingin 'kembali gzip' file-file ini sehingga mereka di-gzip dalam format rsyncable. Kemudian saya dapat menjalankan rsync dari sumber yang dioptimalkan.

Saya pikir ini berarti menjalankan setiap file melalui gunzip dan kemudian gzip --rsyncable tapi saya tidak terlalu yakin bagaimana melakukan ini dengan cara yang tidak akan berisiko kehilangan data atau metadata. Saran diterima dengan penuh syukur.

gogoud
sumber
8
Satu-satunya cara yang --rsyncablepenting adalah jika file-file tersebut diubah antara berjalan dan rsyncmencoba untuk mengirim perubahan. File-file baru tidak peduli apakah dapat di-sinkronisasi ulang atau tidak, karena rsyncharus tetap mengirim semua data. Apakah file sedang diubah antara rsync berjalan?
Tom Hunt
Poin yang bagus. Sebenarnya saya tidak yakin, saya akan memeriksanya. Mari kita asumsikan sekarang bahwa ya isi beberapa file gz memang bisa diubah.
gogoud
Hal terbaik yang dapat saya pikirkan adalah menjalankan skrip yang memeriksa file baru, un-gzip, kemudian gzip lagi --rsyncable.
Tom Hunt
Saya setuju bahwa jika file tidak berubah, ini seharusnya tidak menjadi masalah. Khususnya, untuk kecepatan pastikan Anda melewati checksumming berdasarkan waktu dengan menjaga waktu menggunakan -abendera. Juga, versi gzip saya tidak memiliki --rsyncableflag, tetapi ia datang dengan sebuah program bernama znewyang mungkin dapat digunakan untuk apa yang Anda butuhkan.
user3188445
2
Ternyata, seperti yang Tom pikirkan, file gz yang dibuat oleh rdiff-backup tidak berubah setelah dibuat dan menggunakan --rsyncableitu tidak akan membantu. Saya berharap untuk satu baris kode atau skrip pendek yang akan dengan aman membongkar arsip gz dan membungkusnya kembali menggunakan --rsyncable. Tapi itu hanya pertanyaan akademis bagiku sekarang.
gogoud

Jawaban:

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}
Raúl Salinas-Monteagudo
sumber
1
Dengan melakukan gunzip | gzip, Anda kehilangan nama dan waktu yang tidak terkompresi seperti yang tersimpan dalam file gz (dan terlihat bersama gzip -vNl)
Stéphane Chazelas
@ Stéphane Chazelas: Anda benar: jika informasi ini relevan (tidak pernah relevan bagi saya), kami kehilangannya. Mungkin solusi terbaik bagi gunzip untuk secara langsung mendukung kompresi ulang ini. Itu bisa melewati semua metadata secara internal.
Raúl Salinas-Monteagudo
@ StéphaneChazelas Apakah Anda tahu ada yang harus dilakukan tanpa kehilangan?
Tom Hale