Sanotaan, että minulla on 4 Gt: n tiedosto abc
paikallinen tietokone. Olen ladannut sen etäpalvelimeen SFTP: n kautta, se kesti muutaman tunnin.
Nyt olen muokannut tiedostoa hieman (todennäköisesti enintään 50 Mt, mutta ei peräkkäisiä tavuja tässä tiedostossa) paikallisesti, ja tallensin sen kansioon abc2
. Pidin myös alkuperäisen tiedoston abc
paikallisella tietokoneellani.
Kuinka laskea binäärinen ero abc
ja abc2
?
Sovellukset:
-
Voin lähettää vain
patch
-tiedoston (todennäköisesti enintään 100 Mt) etäinen palvelin sen sijaan, että lataat kokoabc2
-tiedoston uudelleen (se vie taas muutaman tunnin!), ja luoabc2
uudelleen kaukaiselle palvelimelle. palvelin vain osoitteistaabc
japatch
. -
Paikallisesti voisin säästää vain sen sijaan, että tuhlaisin 8 Gt: n varmuuskopiointia sekä div,
abc
ettäabc2
.abc
+patch
, joten se vie vain < 4100 Mt.
Kuinka tämä tehdään?
PS: Tekstille tiedän diff
, mutta täällä etsin jotain, joka voisi toimia missä tahansa raaka-binaarimuodossa, se voi olla zip-tiedostoja tai suoritettavia tiedostoja tai jopa muun tyyppisiä tiedostoja.
PS2: En halua käyttää rsync
; Tiedän, että se pystyy toistamaan muutokset kahden tietokoneen välillä tehokkaalla tavalla (lähettämättä uudelleen tietoja, jotka eivät ole muuttuneet), mutta tässä haluan todella saada patch
-tiedoston, joka on toistettavissa myöhemmin, jos Minulla on sekä abc
että patch
.
Vastaa
Toisessa sovelluksessa / ongelmassa käytän deduplikoitavaa varmuuskopiointiohjelmaa, kuten restic
tai borgbackup
, sen sijaan että yritän seurata manuaalisesti ”korjaustiedostoja” tai eroavaisuuksia. restic
-varmuuskopiointiohjelman avulla voit varmuuskopioida hakemistot useista koneista samaan varmuuskopiointivarastoon, kopioimalla varmuuskopiotiedot sekä yksittäisen koneen tiedostopaloista että koneista. (Minulla ei ole käyttökokemusta borgbackup
-palvelusta, joten en voi sanoa mitään ohjelmasta.)
Lasketaan ja tallennetaan abc
ja abc2
-tiedostot voidaan tehdä rsync
-toiminnolla.
Tämä on esimerkki abc
ja abc2
ollessa 153 Mt. Tiedostoa abc2
on muokattu korvaamalla ensimmäiset 2,3 Mt tiedostosta joitain muita tietoja:
$ 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
Luomme korjaustiedosto abc
-muunnokseksi abc2
ja kutsumalla sitä 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
Luotu tiedosto abc-diff
on todellinen diff (”korjaustiedostosi”), kun taas abc-diff.sh
onlyhyt komentotiedosto, jonka rsync
luo sinulle:
$ cat abc-diff.sh rsync --read-batch=abc-diff ${1:-abc}
Tämä komentosarja muokkaa abc
siten, että siitä tulee identtinen abc2
, koska tiedosto abc-diff
:
$ md5sum abc abc2 be00efe0a7a7d3b793e70e466cbc53c6 abc 3decbde2d3a87f3d954ccee9d60f249b abc2 $ sh abc-diff.sh $ md5sum abc abc2 3decbde2d3a87f3d954ccee9d60f249b abc 3decbde2d3a87f3d954ccee9d60f249b abc2
Tiedosto abc-diff
voidaan nyt siirtää mihin tahansa muualle, missä sinulla on abc
. Komennolla rsync --read-batch=abc-diff abc
kiinnität korjaustiedoston tiedostoon abc
muuttamalla sen sisällön samaksi kuin abc2
-tiedosto järjestelmässä, johon diff luotiin.
Laastarin uudelleenasentaminen toisen kerran näyttää turvalliselta. Virheilmoituksia ei ole eikä tiedoston sisältö muutu (MD5-tarkistussumma ei muutu).
Huomaa, että ellet luo nimenomaista ”käänteistä korjaustiedostoa”, sovellusta ei voi kumota helposti
Testasin myös 2,3 Mt: n muokkauksen kirjoittamisen johonkin muuhun paikkaan abc2
-datassa, hieman sisäänpäin (noin 50 Luettu ”korjaustiedosto” oli 4,6 Mt suuri, mikä viittaa siihen, että vain muokatut bitit oli tallennettu korjaustiedostoon.
Kommentit
- Kiitos paljon @Kusalananda, se ’ on hienoa! PS:
rsync --read-batch=abc-diff ${1:-abc}
(automaattisesti luotu .sh-skripti) antoiremote destination is not allowed with --read-batch
rsync error: syntax or usage error (code 1) at main.c(1326) [Receiver=3.1.2]
, muttarsync --read-batch=abc-diff abc
toimi onnistuneesti.Mitä eroa näillä kahdella samankaltaisella komennolla on? - 2/2 Onko mahdollista ottaa
abc
syötteeksi, käytä korjaustiedostoadiff-abc
--read-batch
kanssa, mutta ei muokkaaabc
” paikallaan ”, mutta lähetä se uuteen tiedostoonabc3
? (jos mahdollista, kaikkirsync
, ilman putkistoa, jotta se toimii helposti Linuxissa ja Windowsissa, joissa on myösrsync.exe
käytettävissä) - @Basj Komennot tekisivät erilaisia asioita, jos
$1
-arvolla olisi arvo.${1:-abc}
tarkoittaa ” käytä ensimmäistä sijaintiparametriä ($1
), ellei se ole ’ ovat tyhjiä tai määrittelemättömiä. Jos se ’ on tyhjä tai määrittelemätön, käytäabc
sen sijaan ”. Olen ’ m olettaen, että$1
oli arvo, kun yritit sitä, mahdollisesti jotain, jonka se tulkitsi etäkohdeosoite. - @Basj I ’ en ole täysin varma, että tämä on mahdollista, mutta en ’ ll katso huomenna unen jälkeen.
- Kiitos vastauksestasi
${1:-abc}
. Se todennäköisesti epäonnistui, koska olen kokeillut sitä Windowsissa (I ’ m käyttämällä rsync-toimintoa sekä etäisen palvelimen Linuxissa että Windowsissa paikallisesti). Mutta se ’ on täydellinen, koskarsync --read-batch=abc-diff abc
toimii 🙂
Vastaa
Kuinka lasketaan binäärinen ero abc: stä ja abc2: sta?
Käyttämällä bsdiff / bspatch tai xdelta ja muita.
$ bsdiff older newer patch.bin # patch.bin is created [...] $ bspatch older newer patch.bin # newer is created
Nämä man-sivujen kehotukset on kuitenkin otettava huomioon:
-
bsdiff
käyttää muistia, joka on 17 kertaa suurempi kuin oldfile , ja vaatii absoluuttisen minimiryhmän, joka on 8 kertaa suurempi kuin oldfile . -
bspatch
käyttää muistia, joka on yhtä suuri kuin oldfile ja newfile . ul>
Kommentit
Vastaa
Oletko kokeillut vain pakottaa diff
käsitellä tiedostoja tekstinä:
diff -ua abc abc2
Kuten selitettiin täällä .
-
-u
tulostaa NUM (oletus 3) riviä yhtenäistä kontekstia -
-a
käsittele kaikkia tiedostoja tekstinä
Tämän pitäisi saada sinulle korjaustiedosto. Tämän haittapuoli on, että ”viivat” voivat olla melko pitkiä ja jotka saattavat paisuttaa laastarin.
Kommentit
- Hups, joo, et ’ et todellakaan halua
n
. Olen ’ kiinnostunut tietämään, toimiiko se I ’ en ole varma kuinka kauan ” rivit ” ovat. - Kiitos kommentistasi! Loin kaksi hyvin samanlaista 256 Mt tiedostoa
abc
jaabc2
. Sitten yritindiff -ua abc abc2 > patch
, sitten kopioinabc
tiedostoonabc3
ja yritin palauttaaabc2
kiitosabc3
japatch
:patch abc3 < patch
, mutta se ei toiminut: lopussaabc3
oli vain 1 kt 256 Mt sijasta. Onko sinulla ideoita? - Hmmm, etkö ole varma mitä tapahtui. Tein sen vain koneellani ja se toimi paremmin kuin olin odottanut.Otin 382M-tiedoston, joka oli satunnaisia kokonaislukuja, jotka oli kirjoitettu binäärisenä tiedostoon. Muutin 3 tavua siinä ja tein diff ja korjaustiedoston ja se toimi. Tuloksena olleet tiedostot olivat md5sum yhtä suuret.
- Jos isossa tiedostossa ei ole tavua
0x0a
, ts. Uutta riviä tai hyvin vähän, epäilen sen olevan ’ ei toimi niin hyvin, olisi mielenkiintoista testata. - Voi varmasti. Voit tehdä koulutetun arvauksen binaarista
wc -l
-tekniikalla, joka etsii rivikatkoja ja kokemukseni mukaan juoksee nopeasti. Odotan mielivaltaiselta binääriltä se toimisi melko hyvin. Esimerkiksi koneeltani löysin 252 Mp4: n, jossa oli 1,2 miljoonaa ” riviä ” ja 59 M.deb
, jolla oli noin 230 kt, joten keskimääräinen ” rivi ” oli vastaavasti alle 220 tavua ja 258 tavua. En ymmärrä ’, miksi nämä tiedostot olisivat niin erilaisia kuin muut, mutta epäonnistut varmasti. Käytännössä epäilen, että se toimisi melko hyvin, ja jos ei, se ’ on silti hauska hakata.
Vastaa
Käytä xdelta , se luotiin juuri tämän tyyppisiin käyttötarkoituksiin. Perustuu uusimpien versioiden VCDIFF-tiedostoon (RFC 3284).
Kommentit
- Linkki ei toimi (onko olemassa toista URL-osoitetta?). Voisitko myös lisätä esimerkin muutamalla rivillä osoittaaksesi, kuinka: 1) lasketaan diff
patch
-tiedosto ja 2) palautetaanabc2
, annettu vainabc
japatch
? - Anteeksi, kiinteä URL-osoite
- Kiitos @vonbrand . Onko sinulla tällainen esimerkki?
Vastaa
Täydennyksiä muihin vastauksiini testiesi mukaan:
Kanssa diff
Loin kaksi hyvin samanlaista 256 Mt tiedostoa abc
ja abc2
. Luo sitten s luoda diff-tiedosto:
diff -ua abc abc2 > abc-abc2.diff
Yritetään nyt palauttaa abc2
alkuperäinen abc
-tiedosto ja abc-abc2.diff
:
cp abc abc3 patch abc3 < abc-abc2.diff
tai
cp abc abc3 patch abc3 -i abc-abc2.diff
tai
patch abc -i abc-abc2.diff -o abc3
Se toimii Linuxissa. Yritin myös Windowsissa (myös patch.exe ja diff.exe ovat saatavilla), mutta tuntemattomasta syystä se epäonnistui: tuotettu abc3
-tiedosto on vain 1 kt 256 Mt: n (I ”) sijaan Päivitän vastauksen myöhemmin täällä).
Kanssa rsync
Kuten hyväksytyssä vastauksessa on kuvattu, tämä toimii:
rsync --only-write-batch=abc-abc2-diff abc2 abc cp abc abc3 rsync --read-batch=abc-abc2-diff abc3
Kanssa rdiff
Kuten tässä on yksityiskohtaisesti vastaus , tämä on myös ratkaisu:
rdiff signature abc abc-signature rdiff delta abc-signature abc2 abc-abc2-delta rdiff patch abc abc-abc2-delta abc3
Testattu myös Windowsissa rdiff.exe-tiedostolla osoitteesta täällä ja se toimii.
Kommentit
- Minä ’ arvaan sen korjaustiedosto epäonnistui Windowsissa, koska se luki syötetiedostoa ” text ” -tilassa, joka ilmoittaa tiedoston lopusta, kun se kohtaa CONTROL -Z (tavu 0x18) syötetiedostossa. Tämä on vanha tila DOS-aikojen alusta, jolloin hakemisto ei tallentanut tiedosto, joten tiedoston pituus laskettiin 512 tavun sektorien lukumäärän perusteella. Jos voit käydä
patch
käskemään avaamaan tiedosto binaaritilassa, sillä ei pitäisi olla ’ tätä virhettä.
bsdiff uses memory equal to 17 times the size of oldfile
joten tämä ei voittanut ’ tavallisesti 4 Gt: n tiedostoja (ainakin 8 Gt: n RAM-koneellani).mydiff abc abc2 > patchfile
jamypatch abc patchfile > abc3
) koosta riippumatta. Lisäksi, jos pilkotaan 128 Mt: n paloiksi, mitä tapahtuu, jos ensimmäinen 1 Gtabc
== viimeinen (jäljellä) 1 Gtabc2
? Kun ’ ll vertaaabc-first128mb
jaabc2-first128mb
, vastaavuutta ei löydy, joten se ei ehkä ole tehokas?