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
patchfá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 teljesabc2fájlt (ez ismét néhány órát igényelne!), és a távoli helyre hozza létre újra aabc2csakabcéspatchszerver. -
Helyileg, ahelyett, hogy 8 GB-ot pazarolnék a
abcés aabc2mentésre, csak menteni tudnékabc+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) adottremote destination is not allowed with --read-batchrsync error: syntax or usage error (code 1) at main.c(1326) [Receiver=3.1.2], dersync --read-batch=abc-diff abcsikeresen 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 aabc” helyét “, hanem inkább kimenjen egy új fájlbaabc3? (ha lehetséges, az összesetrsynckapcsolattal, csővezeték nélkül, hogy könnyen működjön Linuxon, valamint Windowson is, aholrsync.exeis 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 aabc-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 arsync --read-batch=abc-diff abcmű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:
-
bsdiffa 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. -
bspatcholyan 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
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.
-
-ukimenet NUM (alapértelmezett 3) sor egységes kontextusból -
-akezelje 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ésabc2. Aztán megpróbáltam adiff -ua abc abc2 > patch-t, majd aabcfájlt átmásoltam aabc3fájlba, és megpróbáltam helyreállítaniabc2köszönhetőenabc3éspatch:patch abc3 < patch, de nem működött: a végén aabc3csak 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 -lsegí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.debamelyek 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
patchfájlt, és 2) visszaállítja aabc2, csakabcéspatch? - 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
patchfájlnak bináris módban történő megnyitására, akkor ‘ nem kell ezt a hibát tartalmaznia.
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).mydiff abc abc2 > patchfileésmypatch abc patchfile > abc3) lehet meghívni. Továbbá, ha 128 MB-os darabokra vágom, mi történik, ha aabc== első 1 GB-osabc2? Amikor ‘ összehasonlítjuk azabc-first128mbésabc2-first128mbelemeket, akkor nem található egyezés, ezért lehet, hogy nem hatékony?