Varolan gz (gzip) dosyalarını rsyncable'a dönüştürme


12

Her gün birçok yeni olanlar da dahil olmak üzere birçok gz dosyası içeren bir havuzu yedeklemek için rsync kullanıyorum. Bu gz dosyaları gzip'in --rsyncable seçeneğiyle (gz dosyalarını boyutlarını önemli ölçüde artırmadan veya uyumluluklarını etkilemeden çok daha 'rsync dostu' yapar) yapılmadığından, rsync yedeklemesi olması gerekenden daha yavaş ilerler. Ve dosyaları oluşturma zamanında düzeltemiyorum çünkü dosyalar python'un gzip modülünü kullanan bir python betiği (rdiff-backup) tarafından üretiliyor ve bu gzip'in --rsyncable eşdeğerini desteklemiyor.

Bu yüzden rsync çalıştırmadan önce kaynak verilerdeki yeni gz dosyalarını belirleyebilirim (yani rsync'in son çalıştırılmasından bu yana yeni). Şimdi rsyncable-formatında gzip böylece bu dosyaları 'yeniden gzip' istiyorum. Sonra optimize edilmiş kaynaktan rsync çalıştırabilir.

Bu her dosyayı gunzip ve daha sonra gzip --rsyncable çalıştırmak anlamına gelir ama bunu veri veya meta veri kaybetme riski olmayacak bir şekilde nasıl yapacağımı çok emin değilim. Öneriler minnetle alındı.


8
Önemli olan tek --rsyncableşey, dosyaların çalıştırmalar arasında değiştirilip değiştirilmeye rsyncçalışılmasıdır. Yeni dosyalar yeniden senkronize edilip edilmeyecekleri umurumda değildir, çünkü rsynctüm verileri yine de göndermelidir. Rsync çalıştırmaları arasında değiştirilen dosyalar mı var?
Tom Hunt

İyi bir nokta. Aslında emin değilim, bunu kontrol edeceğim. Şimdilik, bazı gz dosyalarının içeriğinin değiştiğini varsayalım.
gogoud

Aklıma gelen en iyi şey, yeni dosyaları kontrol eden bir komut dosyası çalıştırmak, onları çıkartmak, sonra tekrar gzips yapmaktır --rsyncable.
Tom Hunt

Dosyalar değişmezse, bunun bir sorun olmaması gerektiğini kabul ediyorum. Özellikle hız için -abayrağını kullanarak süreleri koruyarak zamana dayalı sağlama toplamını atladığınızdan emin olun . Ayrıca, gzip sürümümde bir --rsyncablebayrak yok, ancak znewmuhtemelen ihtiyacınız olan şey için kullanılabilecek bir programla birlikte geliyor .
user3188445

2
Tom'un düşündüğü gibi, rdiff-backup tarafından oluşturulan gz dosyalarının bir kez oluşturulduktan sonra değişmediği ve bu nedenle kullanmanın --rsyncableyardımcı olmayacağı ortaya çıkıyor. Güvenli bir şekilde gz arşivi açmak ve kullanarak yeniden paketlemek için bir kod veya kısa komut satırı umuyordum --rsyncable. Ama bu sadece benim için akademik bir soru.
gogoud

Yanıtlar:


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
Böylece gunzip | gzip, gz dosyasında saklandığı gzip -vNl
şekliyle

@ Stéphane Chazelas: Haklısın: eğer bu bilgi konuyla ilgiliyse (benim için hiç alakalı olmamışsa), kaybediyoruz. Belki de en iyi çözüm, gunzip'in bu yeniden sıkıştırmayı doğrudan desteklemesi olabilir. Tüm meta verileri dahili olarak geçirebilir.
Raúl Salinas-Monteagudo

@ StéphaneChazelas Kayıpsız bir şekilde yapmayı biliyor musunuz?
Tom Hale
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.