diff-commando: bestanden vergelijken, de patchindeling van diff -u en opties

TestomgevingRHEL-familieAlmaLinux 9.8root-account

Het diff-commando is een Linux-commando dat twee bestanden regel voor regel vergelijkt en alleen de regels toont die verschillen. Bij het vergelijken met diff van een oud en een nieuw bestand die een webserverconfiguratie nabootsen, waren de drie gewijzigde plekken te zien in de drie regels 2,3c2,3, 5d4 en 6a6, en in het patchbestand dat met de optie -u was opgeslagen, stonden dezelfde wijzigingen met min- en plustekens.

De bestandsnamen en inhoud in de uitvoer hieronder en de werkmap /root/work zijn voorbeeldwaarden. Alle vergeleken bestanden zijn kleine bestanden die voor de test zijn gemaakt.

1️⃣ Basisgebruik van het diff-commando en de uitvoer lezen

De basisvorm van het commando is diff, opties, het eerste bestand en het tweede bestand, in die volgorde. Het toont met regelnummers welke regels je moet wijzigen, verwijderen of toevoegen om het eerste bestand gelijk te maken aan het tweede.

De twee bestanden die voor de vergelijking zijn gebruikt, zijn bestanden van zes regels die een webserverconfiguratie nabootsen.

cd /root/work
cat config-old.conf
# app config
listen 80
server_name example.com
root /var/www/html
gzip off
log_level warn
cat config-new.conf
# app config
listen 443
server_name example.com www.example.com
root /var/www/html
log_level warn
cache on

De twee bestanden zijn zonder opties vergeleken.

diff config-old.conf config-new.conf
2,3c2,3
< listen 80
< server_name example.com
---
> listen 443
> server_name example.com www.example.com
5d4
< gzip off
6a6
> cache on
echo $?
1

In de uitvoer wisselen positieregels en inhoudsregels elkaar af. De middelste letter van een positieregel is c voor wijzigen, d voor verwijderen en a voor toevoegen; links van de letter staan de regelnummers van het eerste bestand, rechts die van het tweede. Als er een verschil is, is de afsluitcode 1.

UitvoerBetekenis
2,3c2,3Wijzigt regels 2–3 van het eerste bestand in regels 2–3 van het tweede bestand (change)
5d4Verwijdert regel 5 van het eerste bestand (delete). Daarna sluit het aan na regel 4 van het tweede bestand
6a6Voegt regel 6 van het tweede bestand toe na regel 6 van het eerste bestand (add)
< regelRegel die in het eerste bestand staat
> regelRegel die in het tweede bestand staat
---Grens tussen de kant van het eerste bestand en die van het tweede bestand bij gewijzigde regels (c)

Als je bestanden met dezelfde inhoud vergelijkt, verschijnt er niets en eindigt het commando met afsluitcode 0.

diff config-old.conf config-copy.conf
echo $?
0

Als je een bestand opgeeft dat niet bestaat, verschijnt er een foutmelding en is de afsluitcode 2.

diff config-old.conf nosuch.conf
diff: nosuch.conf: No such file or directory
echo $?
2

In een script onderscheid je met deze drie waarden gelijk, verschillend en fout.

2️⃣ De unified-indeling van diff -u en patchbestanden

De gewone uitvoer toont alleen de gewijzigde regels, waardoor je in een configuratiebestand met honderden regels moeilijk ziet bij welke instelling ze horen. Met -u verschijnt de uitvoer in de unified-indeling (unified), die tot drie regels voor en na de gewijzigde regels meeneemt.

diff -u config-old.conf config-new.conf
--- config-old.conf     2026-10-29 02:24:50.840228932 +0000
+++ config-new.conf     2026-10-29 02:24:50.840228932 +0000
@@ -1,6 +1,6 @@
 # app config
-listen 80
-server_name example.com
+listen 443
+server_name example.com www.example.com
 root /var/www/html
-gzip off
 log_level warn
+cache on

De twee kopregels (---, +++) tonen de naam en de wijzigingstijd van de twee bestanden, en de regel @@ -1,6 +1,6 @@ is een blok (hunk) dat 6 regels vanaf regel 1 van het eerste bestand en 6 regels vanaf regel 1 van het tweede bestand bundelt. In de regels daaronder betekent een - vooraan een regel die uit het eerste bestand is verwijderd, een + een regel die aan het tweede bestand is toegevoegd en een spatie een regel die in beide bestanden gelijk is.

-c is de contextindeling (context). Het blok van het eerste bestand en dat van het tweede bestand verschijnen apart, met een uitroepteken voor gewijzigde regels, een minteken bij verwijderde regels en een plusteken bij toegevoegde regels.

diff -c config-old.conf config-new.conf
*** config-old.conf     Thu Oct 29 02:24:50 2026
--- config-new.conf     Thu Oct 29 02:24:50 2026
***************
*** 1,6 ****
  # app config
! listen 80
! server_name example.com
  root /var/www/html
- gzip off
  log_level warn
--- 1,6 ----
  # app config
! listen 443
! server_name example.com www.example.com
  root /var/www/html
  log_level warn
+ cache on

Bij dezelfde wijzigingen werd -c langer dan -u, omdat de ongewijzigde regels in elk van de twee blokken één keer voorkomen.

Als je de uitvoer van -u in een bestand opslaat, is dat bestand meteen het patchbestand. Ook als de uitvoer naar een bestand gaat, blijft de afsluitcode van diff 1.

diff -u config-old.conf config-new.conf > /root/work/config.patch
echo $?
1
cat /root/work/config.patch
--- config-old.conf     2026-10-29 02:24:50.840228932 +0000
+++ config-new.conf     2026-10-29 02:24:50.840228932 +0000
@@ -1,6 +1,6 @@
 # app config
-listen 80
-server_name example.com
+listen 443
+server_name example.com www.example.com
 root /var/www/html
-gzip off
 log_level warn
+cache on

De inhoud van het opgeslagen bestand is gelijk aan het resultaat van -u dat op het scherm verscheen. Als je dit bestand aan het commando patch geeft, kun je het eerste bestand dezelfde inhoud geven als het tweede.

3️⃣ diff-opties en witruimte en hoofdletters negeren

Als je instellingen met de hand overneemt, ontstaan er regels met dezelfde inhoud die alleen in hoofdletters of spaties verschillen. In het tweede paar voorbeeldbestanden is de hoofdletter L op de eerste regel een kleine letter geworden, is één spatie op de tweede regel in twee veranderd en is er één lege regel toegevoegd.

cat case-a.txt
Listen 80
ServerName example.com
DocumentRoot /var/www/html
cat case-b.txt
listen 80
ServerName  example.com

DocumentRoot /var/www/html
diff case-a.txt case-b.txt
1,2c1,3
< Listen 80
< ServerName example.com
---
> listen 80
> ServerName  example.com
>

Zonder opties verschijnen ook regels 1–2, die hetzelfde betekenen, als gewijzigde regels. Als je met -i hoofdletters negeert, valt de regel Listen weg en blijft alleen regel 2 van het eerste bestand over.

diff -i case-a.txt case-b.txt
2c2,3
< ServerName example.com
---
> ServerName  example.com
>

Met -w erbij worden alle spaties binnen een regel genegeerd, zodat ook de regel ServerName gelijk wordt en alleen de ene lege regel overblijft die op regel 3 is toegevoegd. Met -b, dat alleen het aantal spaties negeert, in plaats van -w was het resultaat bij deze bestanden hetzelfde.

diff -i -w case-a.txt case-b.txt
2a3
>

Met ook nog -B erbij worden verschillen in lege regels eveneens genegeerd, zodat het commando zonder uitvoer eindigde met afsluitcode 0.

diff -i -w -B case-a.txt case-b.txt
echo $?
0

Om de twee bestanden links en rechts naast elkaar te bekijken, gebruik je -y. De standaardbreedte is 130 kolommen en is daarom met -W 70 verkleind.

diff -y -W 70 config-old.conf config-new.conf
# app config                            # app config
listen 80                         |     listen 443
server_name example.com           |     server_name example.com www.ex
root /var/www/html                      root /var/www/html
gzip off                          <
log_level warn                          log_level warn
                                  >     cache on

De verticale streep (|) in het midden staat voor een gewijzigde regel, < voor een regel die alleen in het eerste bestand staat en > voor een regel die alleen in het tweede bestand staat. Bij een kleinere breedte worden lange regels afgekapt. De regel server_name was rechts maar tot www.ex te zien.

Met --suppress-common-lines erbij vallen de gelijke regels weg en blijven alleen de verschillende over.

diff -y --suppress-common-lines -W 70 config-old.conf config-new.conf
listen 80                         |     listen 443
server_name example.com           |     server_name example.com www.ex
gzip off                          <
                                  >     cache on

Om alleen te controleren of de bestanden gelijk of verschillend zijn, en niet wat de verschillen zijn, gebruik je -q. Als de bestanden gelijk zijn, toont -q niets; voor een regel die zegt dat ze gelijk zijn, gebruik je -s.

diff -q config-old.conf config-new.conf
Files config-old.conf and config-new.conf differ
diff -s config-old.conf config-copy.conf
Files config-old.conf and config-copy.conf are identical

De opties staan bij elkaar in de twee tabbladen hieronder.

OptieKopiërenUitleg
-u, --unifiedToont de uitvoer in de unified-indeling, die tot drie regels voor en na de gewijzigde regels meeneemt
-c, --contextContextindeling, die het blok van het eerste bestand en dat van het tweede bestand apart toont
-i, --ignore-caseNegeert verschillen in hoofdletters en kleine letters
-w, --ignore-all-spaceNegeert alle spaties binnen een regel
-b, --ignore-space-changeNegeert alleen verschillen in het aantal spaties
-B, --ignore-blank-linesNegeert verschillen in lege regels
-y, --side-by-sideToont de twee bestanden links en rechts naast elkaar
-W, --widthNUMStelt de breedte in voor uitvoer naast elkaar. De standaardwaarde is 130 kolommen
--suppress-common-linesLaat bij uitvoer naast elkaar de gelijke regels weg en toont alleen de verschillende
-q, --briefToont alleen of de bestanden gelijk of verschillend zijn. Toont niets als ze gelijk zijn
-s, --report-identical-filesToont een regel die zegt dat de bestanden gelijk zijn als de twee bestanden gelijk zijn
-r, --recursiveVergelijkt ook de bestanden in submappen
OptieKopiërenUitleg
-U, --unifiedNUMStelt in hoeveel regels ervoor en erna in de unified-indeling worden meegenomen. De standaardwaarde is 3
-N, --new-fileBehandelt een bestand dat aan één kant ontbreekt als een leeg bestand
-x, --excludePATSluit bestanden waarvan de naam met het patroon overeenkomt uit van de vergelijking
-I, --ignore-matching-linesRENegeert een verschil als alle gewijzigde regels met de regex overeenkomen
-Z, --ignore-trailing-spaceNegeert spaties aan het einde van een regel
-E, --ignore-tab-expansionNegeert verschillen die ontstaan door tabs in spaties om te zetten
-a, --textBehandelt alle bestanden als tekst
--strip-trailing-crVerwijdert de carriage return aan het einde van een regel voor het vergelijken
--colorWHENGeeft de uitvoer kleur. WHEN is never, always of auto
-v, --versionToont versie-informatie

🔲 Simulator voor het diff-commando

In de simulator hieronder kun je diff zelf invoeren met de voorbeeldbestanden uit het artikel. Je kunt met -u een patchbestand opslaan of vergelijken met -i -w -B en -rq, en als je een regel toevoegt aan config-new.conf en opnieuw vergelijkt, verschijnt het gewijzigde resultaat.

Simulator voor het diff-commandodiff · root-account
[root@server work]#
Met de toetsen ↑↓ haal je eerder ingetypte commando's terug.

4️⃣ Mappen vergelijken met diff -r

Om meerdere bestanden tegelijk te vergelijken, bijvoorbeeld voor en na het uitrollen van sitebestanden, geef je mapnamen op in plaats van bestanden. De voorbeeldmappen site-v1 en site-v2 bevatten allebei index.html en een map css, terwijl about.html en contact.html maar aan één kant staan.

diff site-v1 site-v2
Only in site-v1: about.html
Only in site-v2: contact.html
Common subdirectories: site-v1/css and site-v2/css
diff site-v1/index.html site-v2/index.html
2,3c2,3
< <p>Version 1</p>
< <a href="about.html">About</a>
---
> <p>Version 2</p>
> <a href="contact.html">Contact</a>

Als je mappen zonder opties vergelijkt, verschijnen bestanden die maar aan één kant staan als regels met [Only in] en submappen alleen als regels met [Common subdirectories]; de bestanden in de submappen worden niet vergeleken. Voor index.html, dat in beide mappen onder dezelfde naam staat, verschijnen de verschillen onder de regel [diff site-v1/index.html site-v2/index.html]. Met -r verschijnt ook de gewijzigde kleurwaarde in style.css in de map css.

diff -r site-v1 site-v2
Only in site-v1: about.html
Only in site-v2: contact.html
diff -r site-v1/css/style.css site-v2/css/style.css
2c2
< h1 { color: #222; }
---
> h1 { color: #0a58ca; }
diff -r site-v1/index.html site-v2/index.html
2,3c2,3
< <p>Version 1</p>
< <a href="about.html">About</a>
---
> <p>Version 2</p>
> <a href="contact.html">Contact</a>

Bij een map met veel bestanden controleer je eerst met -rq de lijst met gewijzigde bestanden en vergelijk je daarna alleen de benodigde bestanden opnieuw met diff.

diff -rq site-v1 site-v2
Only in site-v1: about.html
Only in site-v2: contact.html
Files site-v1/css/style.css and site-v2/css/style.css differ
Files site-v1/index.html and site-v2/index.html differ

🔢 FAQ & aanbevolen content

cmp vergelijkt twee bestanden byte voor byte en toont alleen de eerste positie waar ze verschillen. Het vergelijken van de twee configuratiebestanden uit het artikel met cmp gaf de ene regel [config-old.conf config-new.conf differ: char 21, line 2]. Je gebruikt het om te controleren of gecomprimeerde bestanden of afbeeldingen gelijk zijn, waarbij vergelijken per regel geen zin heeft.

Geef het oorspronkelijke bestand en het patchbestand in die volgorde door aan het commando patch ([patch config-old.conf config.patch]). patch wijzigt het oorspronkelijke bestand ter plekke, dus schrijf het resultaat met -o naar een ander bestand of pas de patch eerst toe op een kopie.

Met de optie --color[=WHEN] voeg je kleur toe, en op de plek van WHEN zet je never, always of auto. --color zonder waarde is gelijk aan auto en geeft alleen kleur bij uitvoer naar een terminal; om de kleur ook te behouden als je de uitvoer doorgeeft aan een ander commando zoals less, gebruik je --color=always.

ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Laat zien dat je geen machine bent: 6   +   3   =