Hvordan bruke en oppdatering til en fil (og lage oppdateringer) i Linux

Linux patch-kommandoen lar deg overføre endringene fra ett sett med filer til et annet sett med filer raskt og trygt. Lær hvordan du bruker patch på den enkle måten.

Kommandoene for patch og diff

Tenk deg at du har en tekstfil på datamaskinen. Du mottar en modifisert versjon av den tekstfilen fra noen andre. Hvordan overfører du raskt alle endringene fra den endrede filen til den opprinnelige filen? Det er der patch og diff spiller inn. patch og diff finnes i Linux og andre Unix-lignende operativsystemer, for eksempel macOS.

Diff-kommandoen undersøker to forskjellige versjoner av en fil og lister opp forskjellene mellom dem. Forskjellene kan lagres i en fil som kalles en patch-fil.

Patch-kommandoen kan lese en patch-fil og bruke innholdet som et sett med instruksjoner. Ved å følge disse instruksjonene er endringene i den endrede filen replikert i originalen fil.

Forestill deg nå at prosessen skjer med en hel katalog med tekstfiler. Alt på én gang. Det er kraften til patch.

Noen ganger får du ikke tilsendt de endrede filene. Alt du får tilsendt er oppdateringsfilen. Hvorfor sende dusinvis av filer rundt når du kan sende én fil, eller legge ut én fil for enkel nedlasting?

Hva gjør du med oppdateringsfilen for å faktisk lappe filene dine? Bortsett fra nesten å være en tunge-twister, er det også et godt spørsmål. Vi vil lede deg gjennom det i denne artikkelen.

Patch-kommandoen brukes oftest av folk som jobber med programvarekildekodefiler, men den fungerer like bra med ethvert sett med tekstfiler uansett formål, kildekode eller ikke.

Vårt eksempelscenario

I dette scenariet er vi i en katalog kalt work som inneholder to andre kataloger. Den ene heter å jobbe, og den andre heter nyeste. Arbeidsmappen inneholder et sett med kildekodefiler. Den siste katalogen inneholder den nyeste versjonen av disse kildekodefilene, hvorav noen er endret.

  Hvordan spille Age of Empires IV på Linux

For å være sikker er arbeidskatalogen en kopi av gjeldende versjon av tekstfilene. Det er ikke den eneste kopien av dem.

Finne forskjellene mellom to versjoner av en fil

Kommandoen diff finner forskjellene mellom to filer. Standardhandlingen er å liste de modifiserte linjene i terminalvinduet.

En fil heter slang.c. Vi sammenligner versjonen i arbeidskatalogen med den i den nyeste katalogen.

Alternativet -u (unified) forteller diff å også liste noen av de uendrede tekstlinjene fra før og etter hver av de endrede seksjonene. Disse linjene kalles kontekstlinjer. De hjelper patch-kommandoen med å finne nøyaktig hvor en endring må gjøres i den opprinnelige filen.

Vi oppgir navnene på filene slik at diff vet hvilke filer som skal sammenlignes. Den opprinnelige filen vises først, deretter den endrede filen. Dette er kommandoen vi gir for å diff:

diff -u working/slang.c latest/slang.c

diff produserer en utdataliste som viser forskjellene mellom filene. Hvis filene var identiske, ville det ikke vært noen utgang oppført i det hele tatt. Å se denne typen utdata fra diff bekrefter at det er forskjeller mellom de to filversjonene og at den originale filen må lappes.

Lage en patch-fil

For å fange disse forskjellene i en patch-fil, bruk følgende kommando. Det er samme kommando som ovenfor, med utdata fra diff omdirigert til en fil kalt slang.patch.

diff -u working/slang.c latest/slang.c > slang.patch

diff -u working/slang.c nyeste/slang.c > slang.patch i et terminalvindu” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Navnet på patchfilen er vilkårlig.  Du kan kalle det hva du vil.  Det er en god idé å gi den en «.patch»-utvidelse;  men det gjør det klart hvilken type fil det er.</p>
<p>For å få patch til å handle på patchfilen og endre working/slang.c-filen, bruk følgende kommando.  Alternativet -u (unified) lar patch vite at patchfilen inneholder enhetlige kontekstlinjer.  Med andre ord brukte vi -u-alternativet med diff, så vi bruker -u-alternativet med patch.</p>
<div style=

patch -u working.slang.c -i slang.patch

Hvis alt går bra, er det en enkelt linje med utdata som forteller deg at patch retter filen.

Lage en sikkerhetskopi av originalfilen

Vi kan instruere patch til å lage en sikkerhetskopi av lappede filer før de endres ved å bruke alternativet -b (sikkerhetskopiering). Alternativet -i (input) forteller patch navnet på patchfilen som skal brukes:

patch -u -b working.slang.c -i slang.patch

Filen er lappet som før, uten synlig forskjell i utdata. Men hvis du ser inn i arbeidsmappen, vil du se at filen som heter slang.c.orig er opprettet. Dato- og tidsstemplene til filene viser at slang.c.orig er den opprinnelige filen og slang.c er en ny fil opprettet av patch.

Bruke diff med kataloger

Vi kan bruke diff til å lage en patch-fil som inneholder alle forskjellene mellom filene i to kataloger. Vi kan deretter bruke den patchfilen med patch for å få disse forskjellene brukt på filene i arbeidsmappen med en enkelt kommando.

Alternativene vi skal bruke med diff er alternativet -u (enhetlig kontekst) vi har brukt tidligere, alternativet -r (rekursivt) for å få diff til å se inn i alle underkataloger og alternativet -N (ny fil).

Alternativet -N forteller diff hvordan de skal håndtere filer i den siste katalogen som ikke er i arbeidskatalogen. Det tvinger diff til å legge instruksjoner i patch-filen slik at patch oppretter filer som finnes i den nyeste katalogen, men mangler fra arbeidskatalogen.

Du kan sette sammen alternativene slik at de bruker en enkelt bindestrek (-).

Merk at vi bare oppgir katalognavnene, vi ber ikke diff se på spesifikke filer:

diff -ruN working/ latest/ > slang.patch

diff -run working/ latest/ > slang.patch” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<h2 role=Kikker inn i patchfilen

  Slik oppdaterer du Discord-appen på Linux

La oss ta en rask titt på patch-filen. Vi bruker mindre på å se på innholdet.

Øverst i filen viser forskjellene mellom de to versjonene av slang.c.

Scroller vi videre ned gjennom patchfilen ser vi at den da beskriver endringene i en annen fil kalt structs.h. Dette bekrefter at oppdateringsfilen definitivt inneholder forskjellene mellom forskjellige versjoner av flere filer.

Se før du hopper

Å lappe en stor samling av filer kan være litt nervepirrende, så vi kommer til å bruke –tørrkjøringsalternativet for å sjekke at alt er i orden før vi tar steget og forplikter oss til å gjøre endringene.

Alternativet –dry-run forteller patch å gjøre alt bortsett fra å faktisk endre filene. patch vil utføre alle sine forhåndskontroller av filene, og hvis den støter på problemer, rapporterer den dem. Ingen filer endres uansett.

Hvis ingen problemer er rapportert, kan vi gjenta kommandoen uten -dry-run-alternativet og trygt lappe filene våre.

Alternativet -d (katalog) forteller patch hvilken katalog den skal jobbe med.

Merk at vi ikke bruker alternativet -i (input) for å fortelle patch hvilken patch-fil som inneholder instruksjonene fra diff. I stedet omdirigerer vi patchfilen til patch med <. wp_automatic_readability="17.5">

patch --dry-run -ruN -d working 

Out of the entire directory, diff found two files to patch. The instructions regarding the modifications for those two files have been checked by patch , and no problems have been reported.

Pre-flight checks are OK; we’re ready for take-off.

Patching a Directory

To genuinely apply the patches to the files we use the previous command without the --dry-run option.

patch -ruN -d working 

This time each line of output doesn’t start with “checking,” each line starts with “patching.”

And no problems are reported. We can compile our source code, and we’ll be on the latest version of the software.

Settle Your Differences

This is by far the easiest and safest way to use patch. Copy your target files to a folder and patch that folder. Copy them back when you’re happy that the patching process completed error free.