既存の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}

おすすめ記事