おそらく、rsync 関連のツールを確認する必要があります:rdiff および rdiff-backup .rdiff
コマンドを使用すると、パッチ ファイルを作成し、それを他のファイルに適用できます。
rdiff-backup
コマンドはこのアプローチを使用してディレクトリ全体を処理しますが、単一ファイルのディスク イメージで作業していると思われるため、 rdiff
xdelta は、あなたが望むすべてのことを行うことができます。ただし、画像があまりない場合は注意が必要です 同様に、xdelta は定義されたメモリ バッファの半分を違いの検出に使用するため、パッチが非常に大きくなる可能性があります。詳細については、TuningMemoryBudget wiki ページを参照してください。バッファ サイズを大きくすると、かなり改善される場合があります。
bsdiff も別のオプションですが、非常に RAM を大量に消費し、ディスク イメージのサイズにはまったく不適切です。
<ブロック引用>
bsdiff かなりメモリを消費します。 max(17*n,9*n+m)+O(1)
が必要です n
バイトのメモリ は古いファイルのサイズで、m
新しいファイルのサイズです。 bspatch n+m+O(1)
が必要です バイト。
正規の回答
投稿の rdiff に関しては、librsync 2.0.1 はコマンド機能の説明を読むのに適しているため、他に何もなければこの回答の内容を保持するために以下を参照しました。
ファイルを更新するための rdiff の 3 つのステップをよく理解することが重要です:署名 、デルタ 、およびパッチ rdiff の man ページで説明されているとおりです。 rdiff
も見つけました コマンドのサンプル スクリプトを GitHub で参照して引用します。
基本的に...
<オール>file1
] を使用 ] で、署名ファイルを作成します そこから- これは通常、ベース/元のファイル自体よりもはるかに小さい
file2
] と比較します ] ベース ファイルに似ていますが、異なります (recentupdated など) )、差分ファイルを作成します 2 つのファイルの違いのみを含むfile1
] と比較します ] 他のファイルからの変更を含む新しいファイルを生成する [file2
] 2 つを一致させます。クイック コマンド (rdiff-example.sh
あたり) )
rdiff signature file1 signature-file ## signature base file1
rdiff delta signature-file file2 delta-file ## delta differences file2
rdiff patch file1 delta-file gen-file ## compare delta to file1 to create matching file2
<ブロック引用> rdiff-example.sh
# $ rdiff --help
# Usage: rdiff [OPTIONS] signature [BASIS [SIGNATURE]]
# [OPTIONS] delta SIGNATURE [NEWFILE [DELTA]]
# [OPTIONS] patch BASIS [DELTA [NEWFILE]]
# Options:
# -v, --verbose Trace internal processing
# -V, --version Show program version
# -?, --help Show this help message
# -s, --statistics Show performance statistics
# Delta-encoding options:
# -b, --block-size=BYTES Signature block size
# -S, --sum-size=BYTES Set signature strength
# --paranoia Verify all rolling checksums
# IO options:
# -I, --input-size=BYTES Input buffer size
# -O, --output-size=BYTES Output buffer size
# create signature for old file
rdiff signature old-file signature-file
# create delta using signature file and new file
rdiff delta signature-file new-file delta-file
# generate new file using old file and delta
rdiff patch old-file delta-file gen-file
# test
diff -s gen-file new-file
# Files gen-file and new-file are identical
<ブロック引用> はじめに
rdiff は、ネットワーク デルタを計算して適用するプログラムです。 rdiff デルタはバイナリ ファイル間のデルタであり、基本 (または古い) ファイルを自動的に編集して結果 (または新しい) ファイルを生成する方法を記述します。
ほとんどの diff プログラムとは異なり、librsync は、diff の計算時に両方のファイルにアクセスする必要はありません。デルタの計算には、古いファイルの短い「署名」と、新しいファイルの完全な内容が必要です。署名には、古いファイルのブロックのチェックサムが含まれています。これらのチェックサムを使用して、rdiff は新しいファイルで一致するブロックを見つけ、デルタを計算します。
通常、rdiff デルタはコンパクトではなく、xdelta または通常のテキスト diff よりも生成が遅くなります。デルタを計算するときに古いファイルと新しいファイルの両方が存在する可能性がある場合、xdelta は通常、はるかに小さいファイルを生成します。比較対象のファイルがプレーンテキストの場合、通常は GNU diff を選択することをお勧めします。これは、diff が人間によって表示され、不正確な一致として適用される可能性があるためです。
rdiff は、両方のファイルを同時に存在させることが不便な場合に真価を発揮します。この 1 つの例は、2 つのファイルが別々のマシンにあり、違いだけを転送したい場合です。もう 1 つの例は、ファイルの 1 つがアーカイブまたはバックアップ メディアに移動され、その署名だけが残っている場合です。
象徴的に
signature(basis-file) -> sig-file
delta(sig-file, new-file) -> delta-file
patch(basis-file, delta-file) -> recreated-file
パターンを使用
rsync アルゴリズムの典型的なアプリケーションは、ファイル A2 をマシン A から、同様のファイル A1 を持つマシン B に転送することです。これは次のように行うことができます:
<オール>ソース