GNU/Linux >> Znalost Linux >  >> Linux

Binární rozdíl/patch pro velké soubory na linuxu?

Pravděpodobně byste se měli podívat na nástroje související s rsync:rdiff a rdiff-backup .rdiff příkaz vám umožní vytvořit soubor opravy a aplikovat jej na nějaký jiný soubor.

rdiff-backup příkaz používá tento přístup k práci s celými adresáři, ale předpokládám, že pracujete s obrazy disku s jedním souborem, takže rdiff bude ten, který se použije.


xdelta umí vše, co chcete. Spravedlivé varování, pokud vaše obrázky nejsou příliš podobně můžete skončit s velmi velkým patchem, protože xdelta používá polovinu definovaného paměťového bufferu pro hledání rozdílů. Více informací je k dispozici na wiki stránce TuningMemoryBudget. Zvětšení velikosti vyrovnávací paměti může docela pomoci.

bsdiff je další možnost, ale je velmi RAM hladová a zcela nevhodná pro cokoli velikosti obrazu disku.

bsdiff je poměrně náročný na paměť. Vyžaduje max(17*n,9*n+m)+O(1) bajtů paměti, kde n je velikost starého souboru a m je velikost nového souboru. spatch vyžaduje n+m+O(1) bajtů.


Kanonická odpověď

Pokud jde o příspěvek rdiff, librsync 2.0.1 je dobré čtení pro objasnění funkce příkazu, takže jsem na to níže odkazoval, abych zachoval obsah této odpovědi, pokud nic jiného.

Je důležité pokusit se dobře pochopit tři kroky rdiff k aktualizaci souboru:podpis , delta a záplata jak bylo řečeno na manuálové stránce rdiff. Také jsem našel rdiff ukázkový skript příkazu na GitHubu, který je užitečný a na který budu odkazovat a citovat.

V podstatě...

  1. Se "startovacím" nebo základním souborem [file1 ] a vytvoříte soubor s podpisem z toho
    • To je obvykle mnohem menší než samotný základní/původní soubor
  2. S souborem podpisu porovnáte jej s jiným souborem [file2 ] podobný základnímu souboru, ale odlišný (např. nedávno aktualizováno ) a vytvořte delta soubor obsahující pouze rozdíly mezi těmito dvěma soubory
  3. Použijte „pouze rozdíly“ nebo soubor delta a porovnejte jej se základním souborem [file1 ] pro vygenerování nového souboru obsahujícího změny z jiného souboru [file2 ] odpovídající dvěma.

Rychlé příkazy (podle 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

Úvod

rdiff je program pro výpočet a aplikaci síťových delt. Delta rdiff je rozdíl mezi binárními soubory, popisující, jak lze základní (nebo starý) soubor automaticky upravit, aby vznikl výsledný (nebo nový) soubor.

Na rozdíl od většiny programů pro porovnání, librsync nevyžaduje přístup k oběma souborům, když se vypočítá rozdíl. Výpočet delta vyžaduje jen krátký "podpis" starého souboru a kompletní obsah nového souboru. Podpis obsahuje kontrolní součty pro bloky starého souboru. Pomocí těchto kontrolních součtů najde rdiff odpovídající bloky v novém souboru a poté vypočítá delta.

rdiff delta jsou obvykle méně kompaktní a také pomalejší při vytváření než xdelta nebo běžných textových rozdílů. Pokud je možné mít při výpočtu delta přítomné staré i nové soubory, xdelta obecně vytvoří mnohem menší soubor. Pokud jsou porovnávané soubory prostý text, pak je GNU diff obvykle lepší volbou, protože rozdíly mohou být prohlíženy lidmi a aplikovány jako nepřesné shody.

rdiff přijde na své, když není vhodné mít oba soubory současně. Jedním z příkladů je, že dva soubory jsou na samostatných počítačích a chcete přenést pouze rozdíly. Dalším příkladem je případ, kdy byl jeden ze souborů přesunut do archivu nebo záložního média a zůstal pouze jeho podpis.

Symbolicky

signature(basis-file) -> sig-file

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

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

Používejte vzory

Typickou aplikací algoritmu rsync je přenos souboru A2 ze stroje A do stroje B, který má podobný soubor A1. To lze provést následovně:

  1. B generuje podpis rdiff pro A1. Říkejte tomu S1. B odešle podpis A. (Podpis je obvykle mnohem menší než soubor, který popisuje.)
  2. A vypočítá rozdíl rdiff mezi S1 a A2. Nazvěte tuto deltu D. A pošle deltu B.
  3. B použije deltu k opětovnému vytvoření A2. V případech, kdy A1 a A2 obsahují běhy identických bajtů, by měl rdiff poskytnout významnou úsporu místa.

zdroj


Linux
  1. KRename – výkonný dávkový přejmenovávač souborů pro Linux

  2. 7 Příklady příkazů Patch pro použití souborů oprav rozdílů v systému Linux

  3. Jak auditovat změny souborů a spouštění souborů v Linuxu

  1. Jak rozeznat binární soubory od textových souborů v linuxu

  2. Linux:Odeberte přípony souborů pro více souborů

  3. Potřebujete dobrý hex editor pro Linux

  1. 7 tipů pro příkazový řádek Linuxu pro úsporu místa v souborech médií

  2. 10 způsobů, jak analyzovat binární soubory na Linuxu

  3. Linuxový souborový systém se plní, i když nejsou žádné velké soubory nebo adresáře