मौजूदा gz (gzip) फाइलों को rsyncable में कैसे बदलें


12

मैं एक रिपॉजिटरी का बैकअप लेने के लिए rsync का उपयोग कर रहा हूं जिसमें प्रत्येक दिन कई नए सहित कई gz फाइलें होती हैं। Rsync बैकअप इससे अधिक धीमी गति से आगे बढ़ना चाहिए क्योंकि इन gz फ़ाइलों को gzip के arsyncable विकल्प के साथ नहीं बनाया गया है (जो gz फ़ाइलों को उनके आकार में वृद्धि या उनकी संगतता को प्रभावित किए बिना बहुत अधिक 'rsync-friendly' बनाता है)। और मैं निर्माण समय पर समस्या को ठीक नहीं कर सकता क्योंकि फाइलें एक पायथन स्क्रिप्ट (rdiff- बैकअप) द्वारा उत्पन्न होती हैं जो अजगर के gzip मॉड्यूल का उपयोग करता है और यह gzip के --rsyncable के बराबर का समर्थन नहीं करता है।

तो rsync चलाने से पहले मैं स्रोत डेटा में किसी भी नई gz फ़ाइलों की पहचान कर सकता हूं (यानी पिछली बार rsync चलाए जाने के बाद से नया)। अब मैं इन फाइलों को 'रि-गज़िप' करना चाहता हूं ताकि वे rsyncable-format में gzipped हों। फिर मैं अनुकूलित स्रोत से rsync चला सकता हूं।

मुझे लगता है कि इसका मतलब है कि गनज़िप के माध्यम से प्रत्येक फ़ाइल को चलाना और फिर gzip --rsyncable लेकिन मुझे यकीन नहीं है कि यह इस तरह से कैसे किया जाएगा कि डेटा या मेटाडेटा खोने का जोखिम नहीं होगा। कृतज्ञतापूर्वक प्राप्त सुझाव।


8
एकमात्र तरीका यह --rsyncableहोना चाहिए कि अगर रन के बीच फाइलें बदल जाती हैं और rsyncपरिवर्तन भेजने की कोशिश करता है। यदि वे rsyncable हैं या नहीं, तो नई फ़ाइलों की परवाह नहीं है, क्योंकि rsyncउन्हें सारा डेटा वैसे भी भेजना है। क्या rsync रन के बीच फाइलें बदली जा रही हैं?
टॉम हंट

अच्छी बात। वास्तव में मुझे यकीन नहीं है, मैं इसमें जांच करूंगा। चलिए अब मान लेते हैं कि हाँ कुछ gz फाइलों की सामग्री बदल जाती है।
गोगुड़

सबसे अच्छी बात जो मैं सोच सकता हूं वह है एक ऐसी स्क्रिप्ट को चलाना, जो नई फाइलों की जांच करती है, उन्हें गज़िप करती है, फिर उनके साथ फिर से गज़िप्स करती है --rsyncable
टॉम हंट

मैं मानता हूं कि यदि फाइलें नहीं बदलती हैं, तो यह एक मुद्दा नहीं होना चाहिए। विशेष रूप से, गति के लिए सुनिश्चित करें कि आप -aध्वज का उपयोग करके समय को संरक्षित करके समय के आधार पर चेकसमिंग को छोड़ दें । इसके अलावा, मेरे gzip के संस्करण में एक --rsyncableध्वज नहीं है , लेकिन यह एक प्रोग्राम के साथ आता है जिसे कहा जाता है znewकि इसका उपयोग संभवतः आपके लिए आवश्यक हो सकता है।
user3188445

2
यह पता चला है कि, जैसा कि टॉम ने सोचा था, rdiff- बैकअप द्वारा बनाई गई gz फाइलें एक बार बनने के बाद नहीं बदलती हैं और इसलिए इसका उपयोग --rsyncableकरने से मदद नहीं मिलेगी। मैं कोड या शॉर्ट स्क्रिप्ट की एक पंक्ति के लिए उम्मीद कर रहा था जो कि एक gz आर्काइव को सुरक्षित रूप से अनपैक कर देगा और इसका उपयोग करके दोबारा बना देगा --rsyncable। लेकिन यह अब मेरे लिए सिर्फ एक शैक्षणिक प्रश्न है।
गोगुड़

जवाबों:


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éphaneChazelas क्या आप इसे दोषरहित करने के लिए जानते हैं?
टॉम हेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.