既存のgz(gzip)ファイルをrsyncableに変換する方法


12

私はrsyncを使用して、毎日多くの新しいファイルを含む多くのgzファイルを含むリポジトリをバックアップしています。これらのgzファイルはgzipの--rsyncableオプションで構築されていないため、rsyncバックアップの速度は本来よりも遅くなります(サイズを大幅に大きくしたり、互換性に影響を与えたりすることなく、gzファイルをより「rsyncフレンドリー」にします)。また、ファイルはpythonのgzipモジュールを使用するpythonスクリプト(rdiff-backup)によって生成され、gzipの--rsyncableに相当するものをサポートしていないため、作成時に問題を修正できません。

そのため、rsyncを実行する前に、ソースデータ内の新しいgzファイルを識別できます(つまり、rsyncが最後に実行されてからの新しいファイル)。次に、これらのファイルを「再gzip」して、rsyncable-formatでgzip圧縮するようにします。その後、最適化されたソースからrsyncを実行できます。

これは、各ファイルをgunzip、次にgzip --rsyncableで実行することを意味すると思いますが、データやメタデータを失うリスクを冒さない方法でこれを行う方法はあまりわかりません。提案はありがたいことに受け取った。


8
--rsyncable問題になるのは、実行と実行の間にファイルが変更されrsync、変更を送信しようとする場合のみです。rsyncとにかくすべてのデータを送信する必要があるため、新しいファイルはrsyncableかどうかは関係ありません。rsyncの実行中にファイルが変更されていますか?
トム・ハント

いい視点ね。実際、よくわかりませんが、確認します。今のところ、いくつかのgzファイルの内容が変更されると仮定しましょう。
gogoud

私が考えることができる最高のことは、新しいファイルをチェックし、それらを解凍してから、gzipで再度圧縮するスクリプトを実行すること--rsyncableです。
トム・ハント

ファイルが変更されなければ、これは問題ではないことに同意します。特に、高速化のために、-aフラグを使用して時間を保存することにより、時間に基づいたチェックサムをスキップするようにしてください。また、私のバージョンのgzipには--rsyncableフラグがありませんが、znew必要なものにおそらく使用できるプログラムが付属しています。
user3188445

2
トムが考えたように、rdiff-backupによって作成されたgzファイルは一度作成されると変更され--rsyncableないため、使用しても役に立たないことがわかりました。私はgzアーカイブを安全に解凍し、を使用して再パックするコード行または短いスクリプトを期待していました--rsyncable。しかし、それは今私にとって単なる学問です。
gogoud

回答:


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
これによりgunzip | gzip、あなたはGZファイルに保存されている(として見られるように圧縮されていない名前と時間を失うしているgzip -vNl
ステファンChazelas

@StéphaneChazelas:その通りです。もしこの情報が関連していれば(それは私にとって関連性がなかった)、私たちはそれを失います。たぶん、最善の解決策はgunzipがこの再圧縮を直接サポートすることでしょう。内部ですべてのメタデータを渡すことができます。
ラウルサリナス

@StéphaneChazelasロスレスでそれをすることを知っていますか?
トム・ヘイル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.