Linux : comment comparer 2 fichiers ou 2 dossiers avec la commande diff ?
Sommaire
I. Présentation
Sous Linux, il existe une commande très simple et efficace pour comparer deux fichiers : diff. Dans ce tutoriel, nous allons apprendre à l'utiliser afin d'identifier la différence entre deux fichiers, ce qui peut s'avérer utile, par exemple, pour comparer 2 versions d'un script ou d'un fichier de configuration.
Si vous êtes prêts à découvrir quelques exemples d'utilisation de la commande "diff" sous Linux, vous n'avez plus qu'à lire la suite de cet article. Pour ma part, je vais utiliser une machine sous Ubuntu, mais cette commande fonctionne avec les autres distributions.
Version originale de l'article : 29 juillet 2014.
II. Syntaxe de la commande diff
Commençons par évoquer la syntaxe de la commande diff :
diff fichier1 fichier2 [options]
Cette commande retournera un résultat qu'il convient d'interpréter de la façon suivante :
- Les lignes commençant par le symbole "<" se réfère au contenu du premier fichier
- Les lignes commençant par le symbole ">" se réfère au contenu du deuxième fichier.
- Les lettres indiquent comment le premier fichier doit être modifié pour correspondre au second fichier. La sortie peut afficher trois types d'état :
- a : ajouter
- c : modifier
- d : supprimer
Si cela vous semble un peu flou pour le moment, pas de panique, vous allez mieux comprendre en effectuant un premier test de comparaison.
III. Utilisation de la commande diff
Tout d'abord, sachez que la commande diff peut comparer tous les fichiers textes, que ce soit des fichiers de configuration, des scripts Bash, ou encore de simples fichiers textes. Du moment que le contenu est accessible "en clair" en mode texte, l'outil sera capable d'effectuer la comparaison.
Remarque : vous ne pouvez pas comparer 3 fichiers (ou plus) avec la commande diff.
A. Prise en main de diff
Commencez par créer un fichier nommé "fichier1.txt" avec le contenu suivant :
##########
IT-Connect
##########
www.it-connect.fr
Puis, créez un fichier nommé "fichier2.txt" avec le contenu suivant :
##########
IT-Connect
##########
> Démo Tuto Linux
La différence entre ces deux fichiers se situe sur la dernière ligne.
Pour comparer ces deux fichiers, utilisez cette commande :
diff fichier1.txt fichier2.txt
Le résultat suivant est retourné :
4c4
< www.it-connect.fr
---
> > Démo Tuto Linux
Effectuons un décryptage ligne par ligne :
- 4c4 :
Cela signifie qu'il y a une modification ("c" pour "change") à la ligne 4 dans les deux fichiers. La ligne 4 de fichier1.txt a été changée et est différente de la ligne 4 de fichier2.txt.
- < www.it-connect.fr :
Le symbole "<" indique le contenu présent dans fichier1.txt, mais qui ne l'est pas dans le fichier2.txt. Donc, la ligne 4 dans fichier1.txt contient "www.it-connect.fr".
- --- :
Cette ligne sépare les différences entre les deux fichiers.
- > > Démo Tuto Linux :
Le symbole ">" indique le contenu correspondant dans fichier2.txt, mais qui n'est pas présent dans fichier1.txt. Donc, la ligne 4 dans fichier2.txt contient "Démo Tuto Linux".
En résumé, nous obtenons ce qui suit :
B. Que se passe-t-il avec des fichiers identiques ?
Lorsque nous effectuons une comparaison avec diff et que les deux fichiers sont identiques, il n'y a aucun retour dans la console ! Enfin, disons que c'est le comportement par défaut de la commande. Si nous ajoutons l'option "-s", il y a un message qui indique clairement que ces 2 fichiers sont identiques.
diff fichier1.txt fichier2.txt -s
Nous obtenons le résultat suivant :
Les fichiers fichier1.txt et fichier2.txt sont identiques
C. La commande diff et la casse
Par défaut, la commande diff tient compte de la casse, c'est-à-dire qu'elle va considérer que deux fichiers sont différents, s'il s'agit d'une différence liée aux minuscules et majuscules. Pour ne pas tenir compte de la casse, il est nécessaire d'utiliser l'option "-i". Voici un exemple :
diff fichier1.txt fichier2.txt -i
# voire même :
diff fichier1.txt fichier2.txt -is
Ce qui donne :
D. Ne pas tenir compte des sauts de ligne
Par défaut, la commande diff est particulièrement sensible, puisqu'elle prend en considération la casse, ainsi que les sauts de ligne (lignes vides). Pour éviter que les sauts de lignes vides soient considérées comme des différences, nous pouvons utiliser l'option "-B", comme suivant :
diff fichier1.txt fichier2.txt -B
L'image ci-dessous montre bien la différence dans le résultat, en fonction de l'utilisation de l'option "-B". Bien entendu, vous pouvez cumuler ces différentes options.
E. Changer le mode d'affichage
La commande diff prend en charge plusieurs modes d'affichage qui auront un impact sur le formatage du résultat dans la console. L'option "-c" permet de préciser les différences d'une façon plus précise grâce à un symbole devant les lignes concernées.
Il suffit de spécifier l'option de cette façon :
diff fichier1.txt fichier2.txt -c
Avec le fichier1.txt ayant ce contenu :
##########
IT-Connect
##########
Rendez-vous sur IT-Connect :
www.it-connect.fr
Et, le fichier2.txt avec ce contenu :
# Démo
##########
IT-Connect
##########
# Tuto
# Linux
Nous obtenons ce résultat :
*** fichier1.txt 2025-01-16 16:18:32.817171261 +0100
--- fichier2.txt 2025-01-16 16:19:44.665177050 +0100
***************
*** 1,5 ****
##########
IT-Connect
##########
! Rendez-vous sur IT-Connect :
! www.it-connect.fr
--- 1,6 ----
+ # Démo
##########
IT-Connect
##########
! # Tuto
! # Linux
Voici ce que vous devez savoir :
- Les deux premières lignes indiquent l'horodatage des deux fichiers comparés.
- La ligne "*** 1,5 ****" indique la plage de lignes analysées (de la ligne 1 à la ligne 5)
Il y a ensuite un symbole devant les lignes qui représentent une différence entre les deux fichiers :
- Symbole "-" : la ligne doit être supprimée du premier fichier.
- Symbole "+" : la ligne doit être ajoutée au premier fichier.
- Symbole "!" : la ligne doit être remplacée par la ligne correspondante du deuxième fichier.
Par exemple, cela signifie que la ligne "# Démo" doit être ajoutée au premier fichier, pour qu'il y ait une correspondance exacte. Ceci s'explique par la présence du caractère "+" : "+ # Démo".
Voici l'exemple complet en image :
Pour avoir une sortie plus compacte et qui suit la même logique, vous pouvez utiliser l'option "-u" :
diff fichier1.txt fichier2.txt -u
F. Comparer 2 dossiers avec diff
Au-delà de comparer 2 fichiers avec diff, vous pouvez aussi comparer le contenu de 2 dossiers. Ainsi, vous pouvez identifier les fichiers et les dossiers présents dans le répertoire 1, mais pas dans le répertoire 2, et inversement. Pour cela, il suffit d'utiliser l'option "-q".
diff doc1/ doc2/ -q
Seulement dans doc1/: fichier2.txt
Seulement dans doc1/: fichier3.txt
Seulement dans doc2/: fichier5.txt
Voici l'exemple complet :
IV. Conclusion
Suite à la lecture de ce tutoriel, vous savez comment utiliser la commande diff sous Linux, que ce soit pour comparer le contenu de 2 fichiers ou de 2 répertoires ! Si vous souhaitez en savoir encore plus, consultez l'aide de cette commande :
diff --help
pratique simple et efficace !
Merci
Pour info ; sous Windows vous disposez de WinMerge (https://winmerge.org/downloads/?lang=fr).