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, kden
je velikost starého souboru am
je velikost nového souboru. spatch vyžadujen+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ě...
- 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
- 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- 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ě:
- B generuje podpis rdiff pro A1. Říkejte tomu S1. B odešle podpis A. (Podpis je obvykle mnohem menší než soubor, který popisuje.)
- A vypočítá rozdíl rdiff mezi S1 a A2. Nazvěte tuto deltu D. A pošle deltu B.
- 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