기존 gz(gzip) 파일을 rsyncable로 변환하는 방법

기존 gz(gzip) 파일을 rsyncable로 변환하는 방법

저는 rsync를 사용하여 매일 많은 새 파일을 포함하여 많은 gz 파일이 포함된 저장소를 백업하고 있습니다. rsync 백업은 이러한 gz 파일이 gzip의 --rsyncable 옵션을 사용하여 빌드되지 않았기 때문에 예상보다 더 느리게 발생합니다(이는 크기를 크게 늘리거나 호환성 성별에 영향을 주지 않고 gz 파일을 보다 "rsync 친화적"으로 만듭니다). 파일이 Python의 gzip 모듈을 사용하고 gzip과 동등한 --rsyncable을 지원하지 않는 Python 스크립트(rdiff-backup)에 의해 생성되기 때문에 생성 시 문제를 해결할 수 없습니다.

따라서 rsync를 실행하기 전에 소스 데이터에서 새 gz 파일(즉, 마지막으로 rsync를 실행한 이후의 새 파일)을 식별할 수 있습니다. 이제 이러한 파일을 rsyncable 형식으로 gzip하도록 "re-gzip"하고 싶습니다. 그런 다음 최적화된 소스에서 rsync를 실행할 수 있습니다.

나는 이것이 gunzip과 gzip --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}

관련 정보