diff-commando: bestanden vergelijken, de patchindeling van diff -u en opties
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/workcat config-old.conf# app config
listen 80
server_name example.com
root /var/www/html
gzip off
log_level warncat config-new.conf# app config
listen 443
server_name example.com www.example.com
root /var/www/html
log_level warn
cache onDe twee bestanden zijn zonder opties vergeleken.
diff config-old.conf config-new.conf2,3c2,3
< listen 80
< server_name example.com
---
> listen 443
> server_name example.com www.example.com
5d4
< gzip off
6a6
> cache onecho $?1In 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.
| Uitvoer | Betekenis |
|---|---|
| 2,3c2,3 | Wijzigt regels 2–3 van het eerste bestand in regels 2–3 van het tweede bestand (change) |
| 5d4 | Verwijdert regel 5 van het eerste bestand (delete). Daarna sluit het aan na regel 4 van het tweede bestand |
| 6a6 | Voegt regel 6 van het tweede bestand toe na regel 6 van het eerste bestand (add) |
| < regel | Regel die in het eerste bestand staat |
| > regel | Regel 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.confecho $?0Als je een bestand opgeeft dat niet bestaat, verschijnt er een foutmelding en is de afsluitcode 2.
diff config-old.conf nosuch.confdiff: nosuch.conf: No such file or directoryecho $?2In 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 onDe 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 onBij 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.patchecho $?1cat /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 onDe 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.txtListen 80
ServerName example.com
DocumentRoot /var/www/htmlcat case-b.txtlisten 80
ServerName example.com
DocumentRoot /var/www/htmldiff case-a.txt case-b.txt1,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.txt2c2,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.txt2a3
>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.txtecho $?0Om 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 onDe 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.conflisten 80 | listen 443
server_name example.com | server_name example.com www.ex
gzip off <
> cache onOm 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.confFiles config-old.conf and config-new.conf differdiff -s config-old.conf config-copy.confFiles config-old.conf and config-copy.conf are identicalDe opties staan bij elkaar in de twee tabbladen hieronder.
| Optie | Kopiëren | Uitleg |
|---|---|---|
| -u, --unified | Toont de uitvoer in de unified-indeling, die tot drie regels voor en na de gewijzigde regels meeneemt | |
| -c, --context | Contextindeling, die het blok van het eerste bestand en dat van het tweede bestand apart toont | |
| -i, --ignore-case | Negeert verschillen in hoofdletters en kleine letters | |
| -w, --ignore-all-space | Negeert alle spaties binnen een regel | |
| -b, --ignore-space-change | Negeert alleen verschillen in het aantal spaties | |
| -B, --ignore-blank-lines | Negeert verschillen in lege regels | |
| -y, --side-by-side | Toont de twee bestanden links en rechts naast elkaar | |
| -W, --widthNUM | Stelt de breedte in voor uitvoer naast elkaar. De standaardwaarde is 130 kolommen | |
| --suppress-common-lines | Laat bij uitvoer naast elkaar de gelijke regels weg en toont alleen de verschillende | |
| -q, --brief | Toont alleen of de bestanden gelijk of verschillend zijn. Toont niets als ze gelijk zijn | |
| -s, --report-identical-files | Toont een regel die zegt dat de bestanden gelijk zijn als de twee bestanden gelijk zijn | |
| -r, --recursive | Vergelijkt ook de bestanden in submappen |
| Optie | Kopiëren | Uitleg |
|---|---|---|
| -U, --unifiedNUM | Stelt in hoeveel regels ervoor en erna in de unified-indeling worden meegenomen. De standaardwaarde is 3 | |
| -N, --new-file | Behandelt een bestand dat aan één kant ontbreekt als een leeg bestand | |
| -x, --excludePAT | Sluit bestanden waarvan de naam met het patroon overeenkomt uit van de vergelijking | |
| -I, --ignore-matching-linesRE | Negeert een verschil als alle gewijzigde regels met de regex overeenkomen | |
| -Z, --ignore-trailing-space | Negeert spaties aan het einde van een regel | |
| -E, --ignore-tab-expansion | Negeert verschillen die ontstaan door tabs in spaties om te zetten | |
| -a, --text | Behandelt alle bestanden als tekst | |
| --strip-trailing-cr | Verwijdert de carriage return aan het einde van een regel voor het vergelijken | |
| --colorWHEN | Geeft de uitvoer kleur. WHEN is never, always of auto | |
| -v, --version | Toont 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.
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-v2Only 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-v2Only 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-v2Only 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
Linux · Tekst
Linux grep-commando
Zo gebruik je grep om in een tekstbestand, zoals een logbestand, alleen de regels te vinden en te tonen die de gezochte tekenreeks bevatten.
Linux · Tekst
Linux sort-commando: bestanden sorteren
Opties en voorbeelden van sort om de inhoud van een bestand alfabetisch of oplopend en aflopend te sorteren.
Linux · Tekst
Linux uniq-commando
Zo gebruik je uniq om van dubbele regels er maar één over te houden en met -c te tellen hoe vaak ze voorkomen.
ℹ️ 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.