私は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}