วิธีแปลงไฟล์ gz (gzip) ที่มีอยู่เป็น rsyncable


12

ฉันใช้ rsync เพื่อสำรองพื้นที่เก็บข้อมูลที่มีไฟล์ gz จำนวนมากรวมถึงไฟล์ใหม่จำนวนมากในแต่ละวัน การสำรองข้อมูล rsync จะดำเนินการช้ากว่าที่ควรจะเป็นเพราะไฟล์ gz เหล่านี้ไม่ได้สร้างขึ้นด้วยตัวเลือก --rsyncable ของ gzip (ซึ่งทำให้ไฟล์ gz นั้นเป็นมิตรต่อ rsync มากขึ้นโดยไม่เพิ่มขนาดหรือส่งผลต่อความเข้ากันได้) และฉันไม่สามารถแก้ไขปัญหาได้ในขณะที่สร้างเพราะไฟล์ถูกสร้างโดยสคริปต์ python (rdiff-backup) ซึ่งใช้โมดูล gzip ของ python และสิ่งนี้ไม่สนับสนุนเทียบเท่ากับ gzip's --rsyncable

ดังนั้นก่อนที่จะรัน rsync ฉันสามารถระบุไฟล์ gz ใหม่ใด ๆ ในแหล่งข้อมูล (เช่นใหม่นับตั้งแต่มีการเรียกใช้ rsync ครั้งล่าสุด) ตอนนี้ฉันต้องการ 're-gzip' ไฟล์เหล่านี้เพื่อให้พวกเขา gzipped ในรูปแบบ rsyncable จากนั้นฉันสามารถเรียกใช้ rsync จากแหล่งที่ได้รับการปรับปรุง

ฉันคิดว่านี่หมายถึงการเรียกใช้แต่ละไฟล์ผ่าน gunzip และ gzip --rsyncable แต่ฉันไม่แน่ใจว่าจะทำเช่นนี้ได้อย่างไรในลักษณะที่จะไม่เสี่ยงต่อการสูญเสียข้อมูลหรือข้อมูลเมตา คำแนะนำที่ได้รับสุดซึ้ง


8
วิธีเดียวที่--rsyncableควรสำคัญคือถ้าไฟล์ถูกเปลี่ยนระหว่างการรันและrsyncพยายามส่งการเปลี่ยนแปลง ไฟล์ใหม่ไม่สนใจว่ามันสามารถซิงค์ได้หรือไม่เพราะrsyncจะต้องส่งข้อมูลทั้งหมดต่อไป มีการเปลี่ยนแปลงไฟล์ระหว่าง rsync หรือไม่?
Tom Hunt

จุดดี. ที่จริงฉันไม่แน่ใจฉันจะตรวจสอบสิ่งนั้น สมมติว่าตอนนี้มีเนื้อหาของไฟล์ gz บางไฟล์เปลี่ยนไป
gogoud

สิ่งที่ดีที่สุดที่ฉันสามารถคิดคือการเรียกใช้สคริปต์ที่ตรวจสอบไฟล์ใหม่ยกเลิก gzips พวกเขาแล้ว gzips --rsyncableพวกเขาอีกครั้งกับ
Tom Hunt

ฉันยอมรับว่าหากไฟล์ไม่เปลี่ยนแปลงนี่จะไม่เป็นปัญหา โดยเฉพาะอย่างยิ่งสำหรับความเร็วให้แน่ใจว่าคุณข้ามการตรวจสอบตามเวลาโดยการรักษาเวลาโดยใช้-aธง นอกจากนี้เวอร์ชัน gzip ของฉันไม่มีการ--rsyncableตั้งค่าสถานะ แต่มาพร้อมกับโปรแกรมที่เรียกznewว่าอาจใช้กับสิ่งที่คุณต้องการ
user3188445

2
ปรากฎว่า Tom คิดว่าไฟล์ 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)
Stéphane Chazelas

@ Stéphane Chazelas: ถูกต้อง: หากข้อมูลนี้เกี่ยวข้อง (ไม่เคยมีความเกี่ยวข้องกับฉัน) เราสูญเสียมันไป อาจเป็นทางออกที่ดีที่สุดที่ gunzip จะสนับสนุนการบีบอัดข้อมูลโดยตรง สามารถส่งเมทาดาทาทั้งหมดได้ภายใน
Raúl Salinas-Monteagudo

@ StéphaneChazelasคุณรู้หรือไม่ว่ามันจะทำแบบสูญเปล่า?
Tom Hale
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.