Commande diff : comparaison de fichiers, format de patch de diff -u et options
La commande diff est une commande Linux qui compare deux fichiers ligne par ligne et n'affiche que les lignes différentes. En comparant avec diff un ancien fichier et un nouveau fichier qui imitent la configuration d'un serveur web, on a vu les trois endroits modifiés dans les trois lignes 2,3c2,3, 5d4 et 6a6, et le fichier de patch enregistré avec l'option -u présentait les mêmes modifications avec des signes moins et plus.
Les noms et le contenu des fichiers de la sortie ci-dessous ainsi que le dossier de travail /root/work sont des valeurs d'exemple. Tous les fichiers comparés sont de petits fichiers créés pour le test.
1️⃣ Utilisation de base de la commande diff et lecture de la sortie
La forme de base de la commande est diff, les options, le premier fichier puis le second fichier. Elle affiche, avec les numéros de ligne, quelles lignes il faut modifier, supprimer ou ajouter pour que le premier fichier devienne identique au second.
Les deux fichiers utilisés pour la comparaison sont des fichiers de six lignes qui imitent la configuration d'un serveur web.
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 onOn a comparé les deux fichiers sans option.
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 $?1La sortie alterne des lignes de position et des lignes de contenu. La lettre au milieu d'une ligne de position vaut c pour modifier, d pour supprimer et a pour ajouter ; à gauche de la lettre se trouvent les numéros de ligne du premier fichier, à droite ceux du second. S'il y a une différence, le code de sortie est 1.
| Sortie | Signification |
|---|---|
| 2,3c2,3 | Remplace les lignes 2–3 du premier fichier par les lignes 2–3 du second fichier (change) |
| 5d4 | Supprime la ligne 5 du premier fichier (delete). Après suppression, on se retrouve aligné après la ligne 4 du second fichier |
| 6a6 | Ajoute la ligne 6 du second fichier après la ligne 6 du premier fichier (add) |
| < ligne | Ligne présente dans le premier fichier |
| > ligne | Ligne présente dans le second fichier |
| --- | Limite entre le côté du premier fichier et celui du second fichier dans les lignes modifiées (c) |
Quand on compare des fichiers au contenu identique, rien ne s'affiche et la commande se termine avec le code de sortie 0.
diff config-old.conf config-copy.confecho $?0Si l'on donne un fichier qui n'existe pas, un message d'erreur s'affiche et le code de sortie est 2.
diff config-old.conf nosuch.confdiff: nosuch.conf: No such file or directoryecho $?2Dans un script, ces trois valeurs permettent de distinguer identique, différent et erreur.
2️⃣ Format unifié de diff -u et fichiers de patch
La sortie par défaut ne montre que les lignes modifiées, si bien que dans un fichier de configuration de plusieurs centaines de lignes, on a du mal à voir près de quel réglage elles se trouvent. Avec -u, la sortie passe au format unifié (unified), qui regroupe jusqu'à trois lignes avant et après les lignes modifiées.
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 onLes deux lignes d'en-tête (---, +++) donnent le nom et l'heure de modification des deux fichiers, et la ligne @@ -1,6 +1,6 @@ désigne un bloc (hunk) qui regroupe 6 lignes à partir de la ligne 1 du premier fichier et 6 lignes à partir de la ligne 1 du second. Dans les lignes en dessous, un - en tête indique une ligne supprimée du premier fichier, un + une ligne ajoutée au second fichier et une espace une ligne identique dans les deux fichiers.
-c est le format contextuel (context). On obtient séparément le bloc du premier fichier et celui du second, avec un point d'exclamation devant les lignes modifiées, un signe moins sur les lignes supprimées et un signe plus sur les lignes ajoutées.
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 onPour les mêmes modifications, -c a donné une sortie plus longue que -u, car les lignes inchangées apparaissent une fois dans chacun des deux blocs.
Quand on enregistre la sortie de -u dans un fichier, ce fichier est déjà un fichier de patch. Même si la sortie est envoyée dans un fichier, le code de sortie de diff reste 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 onLe contenu du fichier enregistré est identique au résultat de -u affiché à l'écran. En passant ce fichier à la commande patch, on peut donner au premier fichier le même contenu que le second.
3️⃣ Options de diff et ignorer les espaces et la casse
Quand on recopie une configuration à la main, on obtient des lignes au contenu identique qui ne diffèrent que par la casse ou les espaces. La deuxième paire de fichiers d'exemple remplace le L majuscule de la première ligne par une minuscule, transforme une espace de la deuxième ligne en deux et ajoute une ligne vide.
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
>Sans option, les lignes 1–2, qui ont le même sens, ressortent elles aussi comme des lignes modifiées. Si l'on ignore la casse avec -i, la ligne Listen disparaît et il ne reste que la ligne 2 du premier fichier.
diff -i case-a.txt case-b.txt2c2,3
< ServerName example.com
---
> ServerName example.com
>En ajoutant -w, on ignore toutes les espaces à l'intérieur d'une ligne : la ligne ServerName devient elle aussi identique, et il ne reste que la ligne vide ajoutée à la ligne 3. En mettant -b, qui n'ignore que le nombre d'espaces, à la place de -w, on a obtenu le même résultat avec ces fichiers.
diff -i -w case-a.txt case-b.txt2a3
>En ajoutant encore -B, on ignore aussi les différences de lignes vides, et la commande s'est terminée sans sortie avec le code de sortie 0.
diff -i -w -B case-a.txt case-b.txtecho $?0Pour voir les deux fichiers côte à côte, à gauche et à droite, on utilise -y. La largeur par défaut est de 130 colonnes, on l'a donc réduite avec -W 70.
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 onLa barre verticale (|) au milieu indique une ligne modifiée, < une ligne présente seulement dans le premier fichier et > une ligne présente seulement dans le second. Quand on réduit la largeur, les lignes longues sont coupées. La ligne server_name ne s'est affichée à droite que jusqu'à www.ex.
En ajoutant --suppress-common-lines, on retire les lignes identiques pour ne garder que les lignes différentes.
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 onPour vérifier seulement si les fichiers sont identiques ou différents, et non le contenu des différences, on utilise -q. Quand les fichiers sont identiques, -q n'affiche rien ; pour obtenir une ligne indiquant qu'ils sont identiques, on utilise -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 identicalLes options sont réunies dans les deux onglets ci-dessous.
| Option | Copier | Description |
|---|---|---|
| -u, --unified | Affiche au format unifié, qui regroupe jusqu'à trois lignes avant et après les lignes modifiées | |
| -c, --context | Format contextuel, qui affiche séparément le bloc du premier fichier et celui du second | |
| -i, --ignore-case | Ignore les différences de casse | |
| -w, --ignore-all-space | Ignore toutes les espaces à l'intérieur d'une ligne | |
| -b, --ignore-space-change | Ignore seulement les différences de nombre d'espaces | |
| -B, --ignore-blank-lines | Ignore les différences de lignes vides | |
| -y, --side-by-side | Affiche les deux fichiers côte à côte, à gauche et à droite | |
| -W, --widthNUM | Fixe la largeur de l'affichage côte à côte. La valeur par défaut est de 130 colonnes | |
| --suppress-common-lines | Dans l'affichage côte à côte, retire les lignes identiques et n'affiche que les lignes différentes | |
| -q, --brief | Affiche seulement si les fichiers sont identiques ou différents. N'affiche rien s'ils sont identiques | |
| -s, --report-identical-files | Affiche une ligne indiquant que les fichiers sont identiques quand les deux le sont | |
| -r, --recursive | Compare aussi les fichiers des sous-dossiers |
| Option | Copier | Description |
|---|---|---|
| -U, --unifiedNUM | Fixe le nombre de lignes avant et après affichées avec la modification au format unifié. La valeur par défaut est 3 | |
| -N, --new-file | Traite comme un fichier vide le fichier absent d'un côté | |
| -x, --excludePAT | Exclut de la comparaison les fichiers dont le nom correspond au motif | |
| -I, --ignore-matching-linesRE | Ignore la différence si toutes les lignes modifiées correspondent à l'expression régulière | |
| -Z, --ignore-trailing-space | Ignore les espaces en fin de ligne | |
| -E, --ignore-tab-expansion | Ignore les différences dues à la conversion des tabulations en espaces | |
| -a, --text | Traite tous les fichiers comme du texte | |
| --strip-trailing-cr | Retire le retour chariot en fin de ligne avant de comparer | |
| --colorWHEN | Colore la sortie. WHEN vaut never, always ou auto | |
| -v, --version | Affiche les informations de version |
🔲 Simulateur de la commande diff
Dans le simulateur ci-dessous, on peut saisir diff soi-même avec les fichiers d'exemple de l'article. On peut enregistrer un fichier de patch avec -u ou comparer avec -i -w -B et -rq, et si l'on ajoute une ligne à config-new.conf avant de comparer à nouveau, le résultat modifié s'affiche.
4️⃣ Comparer des dossiers avec diff -r
Pour comparer plusieurs fichiers d'un coup, par exemple avant et après le déploiement des fichiers d'un site, on écrit des noms de dossier à la place des fichiers. Les dossiers d'exemple site-v1 et site-v2 contiennent tous deux index.html et un dossier css, tandis que about.html et contact.html ne se trouvent que d'un seul côté.
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>Quand on compare des dossiers sans option, les fichiers présents d'un seul côté apparaissent sous forme de lignes [Only in] et les sous-dossiers seulement sous forme de lignes [Common subdirectories], sans que les fichiers qu'ils contiennent soient comparés. Pour index.html, présent sous le même nom dans les deux dossiers, les différences s'affichent sous la ligne [diff site-v1/index.html site-v2/index.html]. Avec -r, on obtient aussi la valeur de couleur modifiée dans style.css, dans le dossier 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>Pour un dossier qui contient beaucoup de fichiers, on vérifie d'abord la liste des fichiers modifiés avec -rq, puis on compare à nouveau avec diff uniquement les fichiers nécessaires.
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 & contenus recommandés
Linux · Texte
Commande grep sous Linux
Comment utiliser grep pour trouver et afficher uniquement les lignes contenant la chaîne voulue dans un fichier texte, comme un fichier journal.
Linux · Texte
Commande sort sous Linux : trier un fichier
Options et exemples de sort pour trier le contenu d'un fichier par ordre alphabétique, croissant ou décroissant.
Linux · Texte
Commande uniq sous Linux
Comment utiliser uniq pour ne garder qu'une seule des lignes en double et compter avec -c combien de fois elles se répètent.
ℹ️ Mention d'affiliation
Le contenu de ce site contient des liens d'affiliation. Lorsqu'un visiteur achète un produit ou un service via l'un de ces liens, le site perçoit une commission du vendeur. Le montant payé par l'acheteur(il baisse lors des promotions ↓), lui, n'augmente pas. Les prix, remises et stocks indiqués correspondent à la date de rédaction et peuvent différer ; vérifiez-les donc auprès du vendeur avant d'acheter. Les produits sont choisis et évalués selon nos propres critères, et les commissions n'influencent ni l'ordre de présentation ni le contenu des évaluations.