Kahden samanlaisen ison raakabinaaritiedoston ero

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 koko abc2 -tiedoston uudelleen (se vie taas muutaman tunnin!), ja luo abc2 uudelleen kaukaiselle palvelimelle. palvelin vain osoitteista abc ja patch.

  • 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) antoi remote destination is not allowed with --read-batch rsync error: syntax or usage error (code 1) at main.c(1326) [Receiver=3.1.2], mutta rsync --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ä korjaustiedostoa diff-abc --read-batch kanssa, mutta ei muokkaa abc ” paikallaan ”, mutta lähetä se uuteen tiedostoon abc3? (jos mahdollista, kaikki rsync, ilman putkistoa, jotta se toimii helposti Linuxissa ja Windowsissa, joissa on myös rsync.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, koska rsync --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

    • Voisitko mahdollisesti näyttää esimerkin?
    • Kiitos vastauksestasi. 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).
    • @Basj Mikä on mahdollista, on pilkkoa 4 Gt: n tiedosto pienempiin (sanoa 128 Mt kukin) ja tehdä yksittäisiä deltoja. Tämä voitaisiin kääriä käsikirjoitukseen. hienonnettu-bsdiff: pilkkoa tiedostot, tee pareittain bsdiffit, tervaa ne arkistoon. hienonnettu-bspatch: lue pareittain korjaustiedostot arkistosta, käytä syötetiedostojen paloihin, katenoi ulostulo.
    • @Kaz näen, mutta etsin ’ m enemmän käyttövalmis työkalu, joka voidaan kutsua yhdellä rivillä (mydiff abc abc2 > patchfile ja mypatch abc patchfile > abc3) koosta riippumatta. Lisäksi, jos pilkotaan 128 Mt: n paloiksi, mitä tapahtuu, jos ensimmäinen 1 Gt abc == viimeinen (jäljellä) 1 Gt abc2 ? Kun ’ ll vertaa abc-first128mb ja abc2-first128mb, vastaavuutta ei löydy, joten se ei ehkä ole tehokas?

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 ja abc2. Sitten yritin diff -ua abc abc2 > patch, sitten kopioin abc tiedostoon abc3 ja yritin palauttaa abc2 kiitos abc3 ja patch: patch abc3 < patch, mutta se ei toiminut: lopussa abc3 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) palautetaan abc2 , annettu vain abc ja patch?
  • 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ä.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *