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 teljesabc2
fájlt (ez ismét néhány órát igényelne!), és a távoli helyre hozza létre újra aabc2
csakabc
éspatch
szerver. -
Helyileg, ahelyett, hogy 8 GB-ot pazarolnék a
abc
és aabc2
menté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.sh
egy 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-batch
rsync error: syntax or usage error (code 1) at main.c(1326) [Receiver=3.1.2]
, dersync --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 aabc
” helyét “, hanem inkább kimenjen egy új fájlbaabc3
? (ha lehetséges, az összesetrsync
kapcsolattal, csővezeték nélkül, hogy könnyen működjön Linuxon, valamint Windowson is, aholrsync.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 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 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
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
ésabc2
. Aztán megpróbáltam adiff -ua abc abc2 > patch
-t, majd aabc
fájlt átmásoltam aabc3
fájlba, és megpróbáltam helyreállítaniabc2
köszönhetőenabc3
éspatch
:patch abc3 < patch
, de nem működött: a végén aabc3
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 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
patch
fá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-first128mb
elemeket, akkor nem található egyezés, ezért lehet, hogy nem hatékony?