Két hasonló nagy nyers bináris fájl különbsége

Mondjuk, hogy van egy 4 GB-os fájlom abc helyi számítógép. Feltöltöttem egy távoli szerverre SFTP-n keresztül, ez néhány órát vett igénybe.

Most kissé módosítottam a fájlt (valószínűleg legfeljebb 50 MB, de nem egymást követő bájtok ebben a fájlban), és elmentettem a következő helyre: abc2. Az eredeti fájlt abc is a helyi számítógépemen tartottam.

Hogyan számítsuk ki abc és abc2?

Alkalmazások:

  • Csak patch fájlt tudtam küldeni (valószínűleg max. 100 MB) a következő címre: a távoli szervert ahelyett, hogy újból feltöltené a teljes abc2 fájlt (ez ismét néhány órát igényelne!), és a távoli helyre hozza létre újra a abc2 csak abc és patch szerver.

  • Helyileg, ahelyett, hogy 8 GB-ot pazarolnék a abc és a abc2 mentésre, csak menteni tudnék abc + patch, tehát csak < 4100 MB-ra lenne szükség.

Hogyan lehet ezt megcsinálni?

PS: a szöveghez tudok diff, de itt keresem valami, ami bármilyen nyers bináris formátumban használható, lehet ZIP fájlok vagy futtatható fájlok, vagy akár más típusú fájlok.

PS2: Ha lehetséges, nem akarom használni az ; Tudom, hogy hatékony módon képes megismételni a 2 számítógép közötti változásokat (nem küldenem újra a változatlan adatokat), de itt nagyon szeretnék egy patch fájlt, amely később megismételhető, ha Van mind abc, mind pedig patch.

Válasz

A második alkalmazáshoz / problémához deduplikáló biztonsági mentési programot használnék, mint például: restic vagy borgbackup, ahelyett, hogy megpróbálnám manuálisan nyomon követni a “javításokat” vagy a különbségeket. A restic biztonsági mentési program lehetővé teszi a könyvtárak biztonsági másolatának készítését több gépről ugyanarra a biztonsági mentéstárolóra, deduplikálva a biztonsági másolat adatait mind az egyes gépek fájlfoszlányai, mind a gépek között. (Nincs felhasználói tapasztalatom a borgbackup alkalmazással kapcsolatban, ezért “nem tudok semmit mondani az adott programról.”

A abc és abc2 fájlokat a rsync fájlokkal lehet megtenni.

Ez egy példa abc és abc2 153 MB méretűek. A abc2 fájlt felülírta a a fájl első 2,3 MB-ja néhány más adattal:

 $ ls -lh total 626208 -rw-r--r-- 1 kk wheel 153M Feb 3 16:55 abc -rw-r--r-- 1 kk wheel 153M Feb 3 17:02 abc2  

Kiadunk javítás a abc átalakításához abc2 -be és abc-diff:

 $ rsync --only-write-batch=abc-diff abc2 abc  
 $ ls -lh total 631026 -rw-r--r-- 1 kk wheel 153M Feb 3 16:55 abc -rw------- 1 kk wheel 2.3M Feb 3 17:03 abc-diff -rwx------ 1 kk wheel 38B Feb 3 17:03 abc-diff.sh -rw-r--r-- 1 kk wheel 153M Feb 3 17:02 abc2  

A létrehozott abc-diff fájl a tényleges diff (a “patch fájl”), míg a abc-diff.shegy rövid shell parancsfájl, amelyet rsync hoz létre az Ön számára:

 $ cat abc-diff.sh rsync --read-batch=abc-diff ${1:-abc}  

Ez a szkript úgy módosítja a abc -t, hogy az azonos legyen a abc2 -vel, a :

 $ md5sum abc abc2 be00efe0a7a7d3b793e70e466cbc53c6 abc 3decbde2d3a87f3d954ccee9d60f249b abc2 $ sh abc-diff.sh $ md5sum abc abc2 3decbde2d3a87f3d954ccee9d60f249b abc 3decbde2d3a87f3d954ccee9d60f249b abc2  

A mostantól áthelyezhető bárhová, ahol abc van. A rsync --read-batch=abc-diff abc paranccsal a javítást a abc fájlra alkalmazza, és annak tartalmát a abc2 fájl azon a rendszeren, ahol a diff létrehozta.

A javítás másodszoros újbóli alkalmazása biztonságosnak tűnik. Nincsenek hibaüzenetek, és a fájl tartalma sem változik (az MD5 ellenőrző összeg nem változik).

Ne feledje, hogy hacsak nem hoz létre kifejezett “fordított javítást”, nincs lehetőség az alkalmazás egyszerű visszavonására


Kipróbáltam a 2,3 MB-os módosítás írását is valamilyen más helyre az abc2 adatokban, kicsit tovább (kb. 50 körül). A létrehozott “javítás” 4,6 MB méretű volt, ami arra utal, hogy csak a módosított biteket tárolták a javításban.

Megjegyzések

  • Nagyon köszönöm @Kusalananda, nagyon jó! ‘ nagyon jó! PS: rsync --read-batch=abc-diff ${1:-abc} (automatikusan létrehozott .sh szkript) adott remote destination is not allowed with --read-batch rsync error: syntax or usage error (code 1) at main.c(1326) [Receiver=3.1.2], de rsync --read-batch=abc-diff abc sikeresen működött.Mi a különbség e két hasonló parancs között?
  • 2/2 Van-e mód arra, hogy a abc -t bemenetnek vegye, alkalmazza a --read-batch -vel, de nem módosíthatja a abc ” helyét “, hanem inkább kimenjen egy új fájlba abc3? (ha lehetséges, az összeset rsync kapcsolattal, csővezeték nélkül, hogy könnyen működjön Linuxon, valamint Windowson is, ahol rsync.exe is elérhető)
  • @Basj A parancsok különböző dolgokat csinálnának, ha a $1 értéke lenne. A ${1:-abc} azt jelenti, hogy ” használja az első helyzeti paramétert ($1), hacsak nem ‘ s üres vagy nem definiált. Abban az esetben, ha ‘ üres vagy nem definiált, használja a abc -t ” helyett. ‘ m feltételezem, hogy a $1 értéke volt, amikor megpróbálta, esetleg olyasmi, amit értelmezett távoli célcím.
  • @Basj I ‘ nem vagyok teljesen biztos abban, hogy ez lehetséges, de ‘ ll nézz körül holnap alvás után.
  • Köszönjük a ${1:-abc} kérdésre adott válaszodat. Valószínűleg azért nem sikerült, mert kipróbáltam Windows rendszeren (I ‘ m az rsync használatával mind távoli kiszolgálóm Linux-ján, mind pedig lokálisan a Windows-on). De ‘ tökéletes, mivel a rsync --read-batch=abc-diff abc működik 🙂

Válasz

Hogyan lehet kiszámítani az abc és az abc2 bináris eltérését?

A bsdiff / bspatch vagy az xdelta és mások használata.

$ bsdiff older newer patch.bin # patch.bin is created [...] $ bspatch older newer patch.bin # newer is created 

A man oldalakról szóló figyelmeztetéseket azonban figyelembe kell venni:

  • bsdiff a memória mérete 17-szerese a memória méretének oldfile , és abszolút minimális munkakészlet-méretre van szükség, amely a 8-szorosa a oldfile méretének.
  • bspatch olyan memóriát használ, amely megegyezik az oldfile és az newfile méretével, de nagyon kicsi munkakészletet képes elviselni drámai teljesítményvesztés nélkül.

Megjegyzések

  • Tudna esetleg példát mutatni?
  • Köszönöm válaszát. bsdiff uses memory equal to 17 times the size of oldfile, így ez általában nem fog ‘ t használni 4 GB-os fájloknál (legalábbis a 8 GB-os RAM-os gépemen).
  • @Basj Ami lehetséges, az, hogy a 4 GB-os fájlt felaprítja kisebbekre (mondjuk egyenként 128 MB-ra), és külön deleket készít. Ezt be lehetne csomagolni egy szkriptbe. darabolt-bsdiff: aprítsa fel a fájlokat, párosítsa a bsdiff-eket, tárolja fel azokat egy archívumba. Hip-bspatch: olvassa el páronként a javításokat az archívumból, alkalmazza az input fájl darabjaira, a kimenetet catenálja.
  • @Kaz látom, de ‘ m többet keresek használatra kész eszköz, amelyet mérettől függetlenül 1 sorban (mydiff abc abc2 > patchfile és mypatch abc patchfile > abc3) lehet meghívni. Továbbá, ha 128 MB-os darabokra vágom, mi történik, ha a abc == első 1 GB-os abc2 ? Amikor ‘ összehasonlítjuk az abc-first128mb és abc2-first128mb elemeket, akkor nem található egyezés, ezért lehet, hogy nem hatékony?

Válasz

Próbálta már csak kényszeríteni a diff a fájlok szövegként történő kezeléséhez:

diff -ua abc abc2 

Ahogyan itt itt kifejtettük.

  • -u kimenet NUM (alapértelmezett 3) sor egységes kontextusból
  • -a kezelje az összes fájlt szövegként

Ezzel javítást kell kapnia. Ennek hátránya, hogy a “sorok” meglehetősen hosszúak lehetnek, és ez felduzzaszthatja a javítást.

Megjegyzések

  • Hoppá, igen, nem ‘ nem akarja a n -t. ‘ Érdekel, hogy ez úgy működik-e, mint én ‘ nem vagyok biztos abban, hogy a ” sorok ” lesznek.
  • Köszönjük megjegyzését! Két nagyon hasonló 256 MB-os fájlt hoztam létre: abc és abc2. Aztán megpróbáltam a diff -ua abc abc2 > patch -t, majd a abc fájlt átmásoltam a abc3 fájlba, és megpróbáltam helyreállítani abc2 köszönhetően abc3 és patch: patch abc3 < patch, de nem működött: a végén a abc3 csak 1 KB volt 256 MB helyett. Van valami ötlet?
  • Hmmm, nem biztos benne, hogy mi történt. Csak a gépemen csináltam, és jobban működött, mint vártam.Vettem egy 382M-es fájlt, amely véletlenszerű egész szám volt binárisan kiírva egy fájlba. 3 bájtot változtattam benne, megcsináltam a diff-et és a patch-et, és működött. A kapott fájlok md5sum egyenlőek voltak.
  • Ha egy nagy fájlban nincs bájt 0x0a, azaz újsor, vagy nagyon kevés, akkor gyanítom, hogy nem lenne ‘ nem működnek olyan jól, érdekes lenne tesztelni.
  • Ó, biztos. Tudatosan kitalálhat egy binárist a wc -l segítségével, amely sortöréseket keres, és tapasztalatom szerint nagyon gyorsan fut. Arra számítok, hogy egy tetszőleges bináris esetén ez elég jól fog működni. Például a gépemen találtam egy 252M mp4-et, amelynek 1,2 millió ” sora volt “, és egy 59M .deb amelyek kb. 230 ezer, tehát az átlagos ” sorok ” kevesebbek, mint 220 bájt, illetve 258 bájtok. Nem tudom, ‘ miért nem különböznek ezek a fájlok másoktól, de mindenképpen szerencsétlenné válhat. A gyakorlatban gyanítom, hogy elég jól fog működni, és ha nem, akkor ‘ még mindig szórakoztató hackelés.

Válasz

Használja a xdelta alkalmazást, pontosan az ilyen típusú felhasználásokhoz lett létrehozva. A VCDIFF (RFC 3284) alapján a legújabb verziókban.

Megjegyzések

  • A link nem működik (van-e másik URL?). Adna még egy példát néhány sorban annak bemutatásához, hogy: 1) kiszámolja a diff patch fájlt, és 2) visszaállítja a abc2 , csak abc és patch?
  • Sajnáljuk, a rögzített URL
  • Köszönöm @vonbrand . Lenne ilyen példád?

Válasz

Kiegészítés más válaszokhoz a tesztjeim szerint:

diff

Két nagyon hasonló 256 MB-os fájlt hoztam létre abc és abc2. Ezután hozzuk létre a diff fájlt:

diff -ua abc abc2 > abc-abc2.diff 

Most próbálkozzunk abc2 helyreállításával a eredeti abc fájl és abc-abc2.diff:

cp abc abc3 patch abc3 < abc-abc2.diff 

vagy

cp abc abc3 patch abc3 -i abc-abc2.diff 

vagy

patch abc -i abc-abc2.diff -o abc3 

Linux alatt működik. Próbáltam Windows rendszeren is (a patch.exe és a diff.exe is elérhető), de ismeretlen okból nem sikerült: az előállított abc3 fájl 256 MB helyett csak 1 KB (I “) Ezt a választ később itt frissítem).

rsync

Az elfogadott válaszban leírtak szerint ez működik:

rsync --only-write-batch=abc-abc2-diff abc2 abc cp abc abc3 rsync --read-batch=abc-abc2-diff abc3 

rdiff

A válasz , ez is megoldás:

rdiff signature abc abc-signature rdiff delta abc-signature abc2 abc-abc2-delta rdiff patch abc abc-abc2-delta abc3 

Windows-on is tesztelve, az rdiff.exe fájlból, a itt és működik.

Megjegyzések

  • Én ‘ ezt sejtem a javítás sikertelen volt a Windows rendszeren, mert a bemeneti fájlt ” text ” módban olvasta, amely jelzi a fájl végét, amikor egy CONTROL-tal találkozik -Z (0x18 bájt) a bemeneti fájlban. Ez egy korábbi mód a DOS korai napjaitól, amikor a könyvtár nem rögzítette a a fájlt és így a fájl hosszát az 512 bájtos szektorok száma alapján számoltuk ki. Ha meg tudja mondani a patch fájlnak bináris módban történő megnyitására, akkor ‘ nem kell ezt a hibát tartalmaznia.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük