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 luoabc2uudelleen kaukaiselle palvelimelle. palvelin vain osoitteistaabcjapatch. -
Paikallisesti voisin säästää vain sen sijaan, että tuhlaisin 8 Gt: n varmuuskopiointia sekä div,
abcettä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-batchrsync error: syntax or usage error (code 1) at main.c(1326) [Receiver=3.1.2], muttarsync --read-batch=abc-diff abctoimi onnistuneesti.Mitä eroa näillä kahdella samankaltaisella komennolla on? - 2/2 Onko mahdollista ottaa
abcsyötteeksi, käytä korjaustiedostoadiff-abc--read-batchkanssa, 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.exekä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äabcsen sijaan ”. Olen ’ m olettaen, että$1oli 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 abctoimii 🙂
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:
-
bsdiffkäyttää muistia, joka on 17 kertaa suurempi kuin oldfile , ja vaatii absoluuttisen minimiryhmän, joka on 8 kertaa suurempi kuin oldfile . -
bspatchkä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ä .
-
-utulostaa NUM (oletus 3) riviä yhtenäistä kontekstia -
-akä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
abcjaabc2. Sitten yritindiff -ua abc abc2 > patch, sitten kopioinabctiedostoonabc3ja yritin palauttaaabc2kiitosabc3japatch:patch abc3 < patch, mutta se ei toiminut: lopussaabc3oli 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 vainabcjapatch? - 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ä
patchkäskemään avaamaan tiedosto binaaritilassa, sillä ei pitäisi olla ’ tätä virhettä.
bsdiff uses memory equal to 17 times the size of oldfilejoten tämä ei voittanut ’ tavallisesti 4 Gt: n tiedostoja (ainakin 8 Gt: n RAM-koneellani).mydiff abc abc2 > patchfilejamypatch 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-first128mbjaabc2-first128mb, vastaavuutta ei löydy, joten se ei ehkä ole tehokas?