GNU/Linux >> Linux の 問題 >  >> Linux

Linux 上の大きなファイルのバイナリ diff/パッチ?

おそらく、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 に転送することです。これは次のように行うことができます:

    <オール>
  • B は A1 の rdiff 署名を生成します。これを S1 と呼びます。 B は署名を A に送信します (通常、署名は、説明されているファイルよりもはるかに小さいです)。
  • A は、S1 と A2 の間の rdiff デルタを計算します。このデルタを D と呼びます。A はデルタを B に送信します。
  • B はデルタを適用して A2 を再作成します。 A1 と A2 に同一のバイトが連続して含まれている場合、rdiff は大幅なスペースの節約をもたらすはずです。
  • ソース


    Linux
    1. 7 Linux で差分パッチ ファイルを適用するパッチ コマンドの例

    2. Linux でのファイルの変更とファイルの実行を監査する方法

    3. 大きなファイルやディレクトリがないにもかかわらず、Linux ファイルシステムがいっぱいになっている

    1. Linux:複数のファイルのファイル拡張子を削除する

    2. Linux 用の優れた 16 進エディタが必要

    3. Linuxでのファイルタグ付けの良い解決策は何ですか?

    1. Linuxでバイナリファイルを分析する10の方法

    2. Linuxでmvなしでファイルを移動する

    3. Linux 用の大容量ファイル (バックアップ) 用の非常に安定したファイルシステム