GNU/Linux >> Belajar Linux >  >> Linux

Diff/patch biner untuk file besar di linux?

Anda mungkin harus melihat alat terkait rsync:rdiff dan rdiff-backup .rdiff perintah memungkinkan Anda menghasilkan file tambalan dan menerapkannya ke beberapa file lain.

rdiff-backup perintah menggunakan pendekatan ini untuk menangani seluruh direktori, tetapi saya menduga Anda sedang bekerja dengan gambar disk file tunggal, jadi rdiff yang akan digunakan.


xdelta dapat melakukan semua yang Anda inginkan. Peringatan yang adil, jika gambar Anda sangat serupa, Anda bisa mendapatkan tambalan yang sangat besar, karena xdelta menggunakan setengah dari buffer memori yang ditentukan untuk menemukan perbedaan. Informasi lebih lanjut tersedia di halaman wiki TuningMemoryBudget. Meningkatkan ukuran buffer dapat sedikit membantu.

bsdiff adalah opsi lain, tetapi sangat RAM lapar dan sama sekali tidak pantas untuk ukuran gambar disk apa pun.

bsdiff cukup haus memori. Ini membutuhkan max(17*n,9*n+m)+O(1) byte memori, di mana n adalah ukuran file lama dan m adalah ukuran file baru. bpatch membutuhkan n+m+O(1) byte.


Jawaban Kanonis

Mengenai rdiff posting, librsync 2.0.1 adalah bacaan yang bagus untuk klarifikasi fungsionalitas perintah, jadi saya telah merujuknya di bawah untuk menyimpan konten ke jawaban ini jika tidak ada yang lain.

Penting untuk mencoba mendapatkan pemahaman yang baik tentang tiga langkah rdiff untuk memperbarui file:tanda tangan , delta , dan tambalan seperti yang dibicarakan di halaman manual rdiff. Saya juga menemukan rdiff perintah contoh skrip di GitHub yang berguna yang akan saya rujuk dan kutip.

Pada dasarnya...

  1. Dengan file "awal" atau file dasar [file1 ] dan Anda membuat file tanda tangan dari itu
    • Ini biasanya jauh lebih kecil daripada file dasar/asli itu sendiri
  2. Dengan file tanda tangan Anda membandingkannya dengan file lain [file2 ] mirip dengan file dasar Anda tetapi berbeda (mis. baru-baru ini diperbarui ) dan buat file delta hanya berisi perbedaan antara dua file
  3. Gunakan "hanya perbedaan" atau file delta dan bandingkan dengan file dasar Anda [file1 ] untuk menghasilkan file baru yang berisi perubahan dari file lain [file2 ] cocok dengan keduanya.

Perintah Cepat (per 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

contoh-rdiff.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

Pengantar

rdiff adalah program untuk menghitung dan menerapkan delta jaringan. Sebuah delta rdiff adalah delta antara file biner, yang menjelaskan bagaimana file basis (atau lama) dapat diedit secara otomatis untuk menghasilkan file hasil (atau baru).

Tidak seperti kebanyakan program diff, librsync tidak memerlukan akses ke kedua file saat diff dihitung. Menghitung delta hanya membutuhkan "tanda tangan" singkat dari file lama dan isi lengkap dari file baru. Tanda tangan berisi checksum untuk blok file lama. Dengan menggunakan checksum ini, rdiff menemukan blok yang cocok di file baru, lalu menghitung delta.

delta rdiff biasanya kurang kompak dan juga lebih lambat untuk menghasilkan daripada xdelta atau diff teks biasa. Jika dimungkinkan untuk menampilkan file lama dan baru saat menghitung delta, xdelta umumnya akan menghasilkan file yang jauh lebih kecil. Jika file yang dibandingkan adalah teks biasa, maka diff GNU biasanya merupakan pilihan yang lebih baik, karena diff dapat dilihat oleh manusia dan diterapkan sebagai pencocokan yang tidak tepat.

rdiff muncul dengan sendirinya ketika tidak nyaman untuk memiliki kedua file sekaligus. Salah satu contohnya adalah kedua file berada di mesin terpisah, dan Anda hanya ingin mentransfer perbedaannya. Contoh lain adalah ketika salah satu file telah dipindahkan ke arsip atau media cadangan, hanya menyisakan tanda tangannya.

Secara simbolis

signature(basis-file) -> sig-file

delta(sig-file, new-file) -> delta-file

patch(basis-file, delta-file) -> recreated-file

Gunakan pola

Aplikasi khas dari algoritma rsync adalah untuk mentransfer file A2 dari mesin A ke mesin B yang memiliki file serupa A1. Hal ini dapat dilakukan sebagai berikut:

  1. B menghasilkan tanda tangan rdiff dari A1. Sebut ini S1. B mengirimkan tanda tangan ke A. (Tanda tangan biasanya jauh lebih kecil daripada file yang dideskripsikan.)
  2. A menghitung delta rdiff antara S1 dan A2. Panggil delta ini D. A mengirim delta ke B.
  3. B menerapkan delta untuk membuat ulang A2. Jika A1 dan A2 berisi byte identik, rdiff akan memberikan penghematan ruang yang signifikan.

sumber


Linux
  1. 7 tips baris perintah Linux untuk menghemat ruang file media

  2. 10 cara untuk menganalisis file biner di Linux

  3. Cara Audit untuk Modifikasi file dan Eksekusi File di Linux

  1. Bagaimana membedakan biner dari file teks di linux

  2. Linux:hapus ekstensi file untuk banyak file

  3. Butuh editor hex yang bagus untuk Linux

  1. Memindahkan file di Linux tanpa mv

  2. KRename – Pengubah Nama File Batch yang Kuat untuk Linux

  3. 7 Contoh Perintah Patch untuk Menerapkan File Patch Diff di Linux