Cách chuyển đổi tập tin gz (gzip) hiện tại thành rsyncable


12

Tôi đang sử dụng rsync để sao lưu kho chứa nhiều tệp gz bao gồm nhiều tệp mới mỗi ngày. Việc sao lưu rsync tiến hành chậm hơn so với bình thường vì các tệp gz này không được xây dựng với tùy chọn --rsyncable của gzip (giúp các tệp gz trở nên 'thân thiện với rsync' hơn mà không làm tăng đáng kể kích thước hoặc ảnh hưởng đến khả năng tương thích của chúng). Và tôi không thể khắc phục sự cố tại thời điểm tạo vì các tệp được tạo bởi tập lệnh python (sao lưu dự phòng) sử dụng mô-đun gzip của python và điều này không hỗ trợ tương đương với --rsyncable của gzip.

Vì vậy, trước khi chạy rsync, tôi có thể xác định bất kỳ tệp gz mới nào trong dữ liệu nguồn (tức là mới kể từ lần cuối rsync được chạy). Bây giờ tôi muốn 're-gzip' các tệp này để chúng được nén ở định dạng rsyncable. Sau đó, tôi có thể chạy rsync từ nguồn được tối ưu hóa.

Tôi nghĩ điều này có nghĩa là chạy từng tệp thông qua gunzip và sau đó gzip --rsyncable nhưng tôi không chắc chắn làm thế nào để làm điều này theo cách không có nguy cơ mất dữ liệu hoặc siêu dữ liệu. Gợi ý nhận ơn.


8
Cách duy nhất quan --rsyncabletrọng là nếu các tệp bị thay đổi giữa các lần chạy và rsynccố gắng gửi các thay đổi. Các tệp mới không quan tâm liệu chúng có thể được đồng bộ hóa hay không, vì rsyncdù sao cũng phải gửi tất cả dữ liệu. Các tập tin đang được thay đổi giữa các lần chạy rsync?
Tom Hunt

Điểm tốt. Thật ra tôi không chắc lắm, tôi sẽ kiểm tra xem. Bây giờ chúng ta hãy giả sử rằng có nội dung của một số tệp gz bị thay đổi.
gogoud

Điều tốt nhất tôi có thể nghĩ đến là chạy một kịch bản kiểm tra các tệp mới, bỏ gzips chúng, sau đó gzips chúng lại với --rsyncable.
Tom Hunt

Tôi đồng ý rằng nếu các tệp không thay đổi, đây không phải là một vấn đề. Đặc biệt, đối với tốc độ, đảm bảo bạn bỏ qua việc kiểm tra dựa trên thời gian bằng cách duy trì thời gian bằng cách sử dụng -acờ. Ngoài ra, phiên bản gzip của tôi không có --rsyncablecờ, nhưng nó đi kèm với một chương trình có tên znewcó thể được sử dụng cho những gì bạn cần.
user3188445

2
Hóa ra, như Tom nghĩ, các tệp gz được tạo bởi sao lưu dự phòng không thay đổi một khi được tạo và do đó sử dụng --rsyncablesẽ không giúp ích gì. Tôi đã hy vọng cho một dòng mã hoặc tập lệnh ngắn sẽ giải nén an toàn một kho lưu trữ gz và đóng gói lại bằng cách sử dụng --rsyncable. Nhưng bây giờ nó chỉ là một câu hỏi học thuật.
gogoud

Câu trả lời:


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ằng cách thực hiện gunzip | gzip, bạn mất tên và thời gian không nén như được lưu trữ trong tệp gz (và được xem với gzip -vNl)
Stéphane Chazelas

@ Stéphane Chazelas: Bạn đã đúng: nếu thông tin này có liên quan (nó chưa bao giờ phù hợp với tôi), chúng tôi sẽ mất nó. Có lẽ giải pháp tốt nhất sẽ là gunzip hỗ trợ trực tiếp việc nén lại này. Nó có thể vượt qua tất cả các siêu dữ liệu trong nội bộ.
Raúl Salinas-Monteagudo

@ StéphaneChazelas Bạn có biết làm điều gì một cách dễ dàng không?
Tom Hale
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.