rsync를 사용하여 매일 많은 새로운 파일을 포함하여 많은 gz 파일이 포함 된 저장소를 백업하고 있습니다. 이 gz 파일은 gzip의 –rsyncable 옵션으로 빌드되지 않기 때문에 rsync 백업이 속도보다 느리게 진행됩니다 (이로 인해 크기를 크게 늘리거나 호환성에 영향을주지 않고 gz 파일을 훨씬 ‘rsync-friendly’로 만들 수 있습니다). 그리고 파일은 파이썬의 gzip 모듈을 사용하는 파이썬 스크립트 (rdiff-backup)에 의해 생성되고 gzip의 –rsyncable과 동등한 기능을 지원하지 않기 때문에 생성시 문제를 해결할 수 없습니다.
따라서 rsync를 실행하기 전에 소스 데이터에서 새 gz 파일을 식별 할 수 있습니다 (즉, rsync가 마지막으로 실행 된 이후의 새 파일). 이제 rsyncable 형식으로 압축되도록 이러한 파일을 ‘gzip으로 다시 압축하고 싶습니다. 그런 다음 최적화 된 소스에서 rsync를 실행할 수 있습니다.
나는 이것이 gunzip과 gzip –rsyncable을 통해 각 파일을 실행하는 것을 의미한다고 생각하지만 데이터 또는 메타 데이터를 잃을 위험이없는 방식 으로이 작업을 수행하는 방법을 잘 모르겠습니다. 감사의 말을 받았습니다.
답변
#! /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}