Commande diff : comparaison de fichiers, format de patch de diff -u et options

Environnement de testFamille RHELAlmaLinux 9.8Compte root

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/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

On a comparé les deux fichiers sans option.

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

La 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.

SortieSignification
2,3c2,3Remplace les lignes 2–3 du premier fichier par les lignes 2–3 du second fichier (change)
5d4Supprime la ligne 5 du premier fichier (delete). Après suppression, on se retrouve aligné après la ligne 4 du second fichier
6a6Ajoute la ligne 6 du second fichier après la ligne 6 du premier fichier (add)
< ligneLigne présente dans le premier fichier
> ligneLigne 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.conf
echo $?
0

Si 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.conf
diff: nosuch.conf: No such file or directory
echo $?
2

Dans 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 on

Les 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 on

Pour 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.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

Le 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.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
>

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.txt
2c2,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.txt
2a3
>

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.txt
echo $?
0

Pour 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 on

La 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.conf
listen 80                         |     listen 443
server_name example.com           |     server_name example.com www.ex
gzip off                          <
                                  >     cache on

Pour 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.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

Les options sont réunies dans les deux onglets ci-dessous.

OptionCopierDescription
-u, --unifiedAffiche au format unifié, qui regroupe jusqu'à trois lignes avant et après les lignes modifiées
-c, --contextFormat contextuel, qui affiche séparément le bloc du premier fichier et celui du second
-i, --ignore-caseIgnore les différences de casse
-w, --ignore-all-spaceIgnore toutes les espaces à l'intérieur d'une ligne
-b, --ignore-space-changeIgnore seulement les différences de nombre d'espaces
-B, --ignore-blank-linesIgnore les différences de lignes vides
-y, --side-by-sideAffiche les deux fichiers côte à côte, à gauche et à droite
-W, --widthNUMFixe la largeur de l'affichage côte à côte. La valeur par défaut est de 130 colonnes
--suppress-common-linesDans l'affichage côte à côte, retire les lignes identiques et n'affiche que les lignes différentes
-q, --briefAffiche seulement si les fichiers sont identiques ou différents. N'affiche rien s'ils sont identiques
-s, --report-identical-filesAffiche une ligne indiquant que les fichiers sont identiques quand les deux le sont
-r, --recursiveCompare aussi les fichiers des sous-dossiers
OptionCopierDescription
-U, --unifiedNUMFixe 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-fileTraite comme un fichier vide le fichier absent d'un côté
-x, --excludePATExclut de la comparaison les fichiers dont le nom correspond au motif
-I, --ignore-matching-linesREIgnore la différence si toutes les lignes modifiées correspondent à l'expression régulière
-Z, --ignore-trailing-spaceIgnore les espaces en fin de ligne
-E, --ignore-tab-expansionIgnore les différences dues à la conversion des tabulations en espaces
-a, --textTraite tous les fichiers comme du texte
--strip-trailing-crRetire le retour chariot en fin de ligne avant de comparer
--colorWHENColore la sortie. WHEN vaut never, always ou auto
-v, --versionAffiche 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.

Simulateur de la commande diffdiff · Compte root
[root@server work]#
Les touches ↑↓ rappellent les commandes saisies auparavant.

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-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>

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-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>

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-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 & contenus recommandés

cmp compare deux fichiers octet par octet et n'affiche que la première position où ils diffèrent. La comparaison avec cmp des deux fichiers de configuration de l'article a donné la seule ligne [config-old.conf config-new.conf differ: char 21, line 2]. On l'utilise pour vérifier si des fichiers compressés ou des images, pour lesquels une comparaison ligne par ligne n'a pas de sens, sont identiques.

On passe à la commande patch le fichier d'origine puis le fichier de patch ([patch config-old.conf config.patch]). patch modifie le fichier d'origine sur place ; on écrit donc le résultat dans un autre fichier avec -o, ou on l'applique d'abord à une copie.

L'option --color[=WHEN] ajoute de la couleur, et WHEN prend la valeur never, always ou auto. --color sans valeur équivaut à auto et n'ajoute de la couleur que pour une sortie vers un terminal ; pour garder la couleur quand on passe la sortie à une autre commande comme less, on utilise --color=always.

ℹ️ 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Prouvez que vous êtes humain : 7   +   2   =