Lurer du på hvordan du kan identifisere ulikheter mellom to tekstfiler? Da er
`diff`-kommandoen verktøyet du trenger. Denne guiden viser deg den enkle
måten å bruke `diff` i Linux og macOS.
En dypere titt på `diff`
Kommandoen `diff` analyserer to filer og presenterer en oversikt over
avvikene mellom dem. Mer spesifikt genererer den en liste over de endringene
som må utføres i den første filen for at den skal bli identisk med den andre.
Med dette i tankene blir det enklere å tolke utdataene fra `diff`. `Diff`
ble designet for å finne forskjeller i kildekodefiler og for å generere
utdata som andre programmer, som for eksempel
patch-kommandoen, kunne lese og bruke. I denne veiledningen skal vi se på de
mest praktiske og leservennlige måtene å bruke `diff` på.
La oss umiddelbart begynne med å sammenligne to filer. Rekkefølgen av filene
på kommandolinjen bestemmer hvilken fil som betraktes som den «første filen»
og hvilken som anses som den «andre filen». I eksemplet under er `alpha1` den
første filen, og `alpha2` er den andre. Begge filene inneholder det
fonetiske alfabetet, men `alpha2` har gjennomgått noen ekstra redigeringer, slik at de to
filene ikke er helt like.
Vi kan sammenligne filene ved hjelp av denne kommandoen. Skriv `diff`, et
mellomrom, navnet på den første filen, et mellomrom, navnet på den andre
filen, og trykk deretter på Enter.
diff alpha1 alpha2
Hvordan tolker vi dette resultatet? Når du vet hva du skal se etter, er det ikke så vanskelig. Hver forskjell er listet opp i en enkelt kolonne, og hver forskjell er merket. Etiketten består av tall på hver side av en bokstav, for eksempel `4c4`. Det første tallet er linjenummeret i `alpha1`, og det andre tallet er linjenummeret i `alpha2`. Bokstaven i midten kan være:
`c`: Linjen i den første filen må endres for å samsvare med linjen i den
andre filen.
`d`: Linjen i den første filen må slettes for å samsvare med den andre
filen.
`a`: Innhold må legges til den første filen for at den skal samsvare med den
andre filen.
`4c4` i vårt eksempel indikerer at linje fire i `alpha1` må endres for å
samsvare med linje fire i `alpha2`. Dette er den første ulikheten som ble
funnet mellom de to filene.
Linjer som begynner med `<` refererer til den første filen, `alpha1`.
Linjen som begynner med `>` refererer til den andre filen, `alpha2`. Linjen
`> Dave` informerer oss om at ordet `Dave` er innholdet i linje fire i
`alpha2`. Oppsummert betyr dette at vi må erstatte `Delta` med `Dave` på
linje fire i `alpha1` for at denne linjen skal være identisk i begge filer.
Den neste endringen er merket med `12c12`. Ved å bruke samme logikk,
forteller dette oss at linje 12 i `alpha1` inneholder ordet `Lima`, mens linje
12 i `alpha2` inneholder ordet `Linux`.
Den tredje endringen henviser til en linje som er slettet fra `alpha2`.
Etiketten `21d20` kan tolkes som «linje 21 må slettes fra den første filen
for at begge filene skal være synkroniserte fra linje 20 og videre.»
Den fjerde forskjellen er merket `26a26,28`. Denne endringen viser til tre
ekstra linjer som er lagt til `alpha2`. Legg merke til `26,28` i etiketten.
Tall som er skilt med komma, representerer en serie linjenumre. I dette
eksemplet er det området fra linje 26 til linje 28. Etiketten tolkes som «på
linje 26 i den første filen, legg til linjene 26 til 28 fra den andre filen.»
Vi får vist de tre linjene i `alpha2` som må legges til `alpha1`. Disse
inneholder ordene `Quirk`, `Strange` og `Charm`.
Raske kommandoer
Hvis du kun ønsker å vite om to filer er like, kan du bruke alternativet `-s`
(viser identiske filer).
diff -s alpha1 alpha3
Du kan bruke alternativet `-q` (kort) for å få en like kortfattet melding om
at to filer er forskjellige.
diff -q alpha1 alpha2
Vær oppmerksom på at med to identiske filer vil alternativet `-q` (kort) ikke
rapportere noe i det hele tatt.
Et alternativt perspektiv
Alternativet `-y` (side om side) bruker en annen layout for å vise
forskjellene mellom filene. Det er ofte nyttig å kombinere `-y` med
alternativet `-W` (bredde) for å begrense antall kolonner som vises. Dette
forhindrer at linjene blir uoversiktlige og vanskelige å lese. I eksemplet
under ber vi `diff` om å vise filene side om side og begrense utdataene til
70 kolonner.
diff -y -W 70 alpha1 alpha2
Den første filen i kommandoen, `alpha1`, vises til venstre, mens den andre
filen, `alpha2`, vises til høyre. Linjene fra hver fil vises ved siden av
hverandre. Ved siden av linjene i `alpha2` finner du indikatorer som viser
om linjen er endret, slettet eller lagt til.
`|`: En linje som er endret i den andre filen.
`<`: En linje som er slettet fra den andre filen.
`>`: En linje som er lagt til den andre filen som ikke finnes i den første
filen.
Hvis du foretrekker en mer kompakt side-om-side-oppsummering av forskjellene
mellom filene, kan du bruke alternativet `–suppress-common-lines`. Dette
tvinger `diff` til kun å vise de endrede, tilføyde eller slettede linjene.
diff -y -W 70 --suppress-common-lines alpha1 alpha2
Legg til litt farge
Et annet verktøy, `colordiff`, legger til fargekoding i utdataene fra
`diff`. Dette gjør det mye lettere å se hvilke linjer som er endret.
Bruk `apt-get` for å installere denne pakken på systemet ditt hvis du
bruker Ubuntu eller en annen Debian-basert distribusjon. På andre
Linux-distribusjoner bruker du pakkebehandlingsverktøyet for din
distribusjon.
sudo apt-get install colordiff
Bruk `colordiff` på samme måte som du ville brukt `diff`.
`colordiff` er egentlig bare et skall rundt `diff`, og `diff` gjør alt
arbeidet i bakgrunnen. Som et resultat vil alle `diff`-alternativer fungere
med `colordiff`.
Gi litt kontekst
For å finne et kompromiss mellom å vise alle linjene i filene på skjermen og
kun de endrede linjene, kan vi be `diff` om å vise litt kontekst. Det er to
måter å gjøre dette på. Begge metodene oppnår samme mål, som er å vise noen
linjer før og etter hver endret linje. Dette gir deg en bedre oversikt over
hva som skjer i filen der forskjellen ble oppdaget.
Den første metoden bruker alternativet `-c` (kopiert kontekst).
colordiff -c alpha1 alpha2
Utdataene fra `diff` har en header. Overskriften viser de to filnavnene og
endringstidene deres. Det er stjerner (*) før navnet på den første filen og
bindestreker (-) før navnet på den andre filen. Disse symbolene vil bli
brukt til å indikere hvilken fil linjene i utdataene tilhører.
En linje med stjerner med `1,7` i midten indikerer at vi ser på linjer fra
`alpha1`. Mer presist ser vi på linje 1 til 7. Ordet `Delta` er merket som
endret. Det er et utropstegn (!) ved siden av ordet, og det er farget rødt.
Det vises tre linjer med uendret tekst før og etter denne linjen, slik at vi
kan se konteksten til linjen i filen.
Linjen med bindestreker med `1,7` i midten indikerer at vi ser på linjer fra
`alpha2`. Vi ser igjen på linje 1 til 7, og ordet `Dave` på linje fire er
merket som forskjellig.
colordiff -C 2 alpha1 alpha2
Tre linjer med kontekst over og under hver endring er standardverdien. Du
kan selv bestemme hvor mange linjer med kontekst du vil at `diff` skal vise.
For å gjøre dette, bruker du alternativet `-C` (kopiert kontekst) med stor
`C` og angir antall linjer du ønsker.
colordiff -u alpha1 alpha2
Det andre alternativet som tilbyr kontekst, er alternativet `-u` (enhetlig
kontekst).
Som før har utdataene en header. De to filene er navngitt, og
endringstidene deres vises. Det er bindestreker (-) før navnet på `alpha1` og
plusstegn (+) før navnet på `alpha2`. Dette indikerer at bindestreker vil
bli brukt for å referere til `alpha1`, og plusstegn vil bli brukt for å
referere til `alpha2`. Spridd over hele oppføringen er linjer som begynner
med et krøllalfa-tegn (@). Disse linjene markerer starten på hver forskjell.
De viser også hvilke linjer som vises fra hver fil.
Vi får vist de tre linjene før og etter linjen som er merket som
forskjellig, slik at vi kan se konteksten til den endrede linjen. I den
enhetlige visningen vises linjene med forskjellen over hverandre. Linjen fra
`alpha1` begynner med en bindestrek, mens linjen fra `alpha2` begynner med
et plusstegn. Denne visningen klarer å vise det samme på åtte linjer som den
kopierte kontekstvisningen brukte femten linjer på.
colordiff -U 2 alpha1 alpha2
Som forventet kan vi be diff om å oppgi nøyaktig antall linjer med enhetlig
kontekst vi ønsker å se. For å gjøre dette, bruk alternativet `-U`
(enhetlig kontekst) med stor `U` og angi antall linjer du ønsker:
Ignorer mellomrom og små/store bokstaver
colordiff -y -W 70 test4 test5
La oss analysere to andre filer, `test4` og `test5`. Disse inneholder navn på seks superhelter.
Resultatene viser at `diff` ikke finner noen forskjell i linjene med `Black
Widow`, `Spider-Man` og `Thor`. Den markerer endringer i linjene med
`Captain America`, `Ironman` og `The Hulk`.
Så hva er forskjellig? Vel, i `test5` er `Hulk` stavet med liten `h`, og
`Captain America` har et ekstra mellomrom mellom `Captain` og `America`. Det
er lett å se, men hva er galt med `Ironman`-linjen? Det er ingen synlige
forskjeller. Her er en god tommelfingerregel: Hvis du ikke kan se det, er
svaret mellomrom. Det er nesten helt sikkert ett eller flere mellomrom, eller
et tabulatortegn, på slutten av den linjen.
Hvis du ikke bryr deg om slike forskjeller, kan du be `diff` om å ignorere
visse typer forskjeller, inkludert:
`-i`: Ignorer forskjeller i bruk av små og store bokstaver.
`-Z`: Ignorer etterfølgende mellomrom.
`-b`: Ignorer endringer i mengden mellomrom.
`-w`: Ignorer alle forskjeller i mellomrom.
colordiff -i -y -W 70 test4 test5
La oss be `diff` om å sjekke filene på nytt, men denne gangen om å ignorere
eventuelle forskjeller i bruk av små og store bokstaver.
colordiff -i -Z -y -W 70 test4 test5
Linjene med `The Hulk` og `The hulk` betraktes nå som like, og forskjellen
med liten `h` blir ikke lenger markert. La oss be `diff` om også å ignorere
etterfølgende mellomrom.
colordiff -i -w -y -W 70 test4 test5
Som antatt må etterfølgende mellomrom ha vært forskjellen i
`Ironman`-linjen, fordi `diff` ikke lenger markerer den som forskjellig. Det
gjenstår `Captain America`. La oss be `diff` om å ignorere forskjeller i
bruk av store og små bokstaver og alle problemer med mellomrom.
Ved å fortelle `diff` å ignorere forskjellene som vi ikke bryr oss om,
forteller `diff` oss at filene er like for vårt formål.
Diff-kommandoen har mange flere alternativer, men de fleste av dem er
relatert til å produsere maskinlesbare utdata. Disse kan gjennomgås på
Linux-manualsiden.
Alternativene vi har brukt i eksemplene over, vil gjøre deg i stand til å
identifisere alle ulikhetene mellom versjoner av tekstfilene dine, ved hjelp
av kommandolinjen og dine egne øyne.