Comment comparer deux fichiers texte dans le terminal Linux



Vous cherchez à identifier les variations entre deux versions d’un fichier texte ? La commande diff est l’outil qu’il vous faut. Ce guide vous expliquera comment l’utiliser facilement sur les systèmes Linux et macOS.

Exploration de la commande diff

La commande diff compare deux fichiers et affiche une liste des différences entre eux. Plus précisément, elle génère une liste des modifications nécessaires pour faire correspondre le premier fichier au second. Garder cela à l’esprit facilitera la compréhension de la sortie de diff. Cette commande a été conçue pour détecter les divergences dans les fichiers de code source et pour produire un résultat qui puisse être interprété et utilisé par d’autres programmes, tel que la commande patch. Ce tutoriel explorera les utilisations les plus pratiques de diff.

Analysons ensemble deux fichiers. L’ordre dans lequel les fichiers sont spécifiés dans la ligne de commande détermine quel fichier diff considère comme le « premier » et le « second ». Dans l’exemple suivant, alpha1 est le premier fichier et alpha2 le second. Les deux fichiers contiennent l’alphabet phonétique, mais le second fichier, alpha2, a subi quelques modifications, ce qui fait que les deux fichiers ne sont pas identiques.

Pour comparer ces fichiers, utilisez la commande suivante : tapez diff, un espace, le nom du premier fichier, un espace, le nom du second fichier, puis appuyez sur Entrée.

diff alpha1 alpha2

Comment interpréter cette sortie ? Une fois que vous savez ce qu’il faut rechercher, ce n’est pas si complexe. Chaque différence est listée individuellement et étiquetée. L’étiquette comporte des chiffres de chaque côté d’une lettre, par exemple 4c4. Le premier chiffre est le numéro de ligne dans alpha1, et le second est le numéro de ligne dans alpha2. La lettre au milieu peut être :

c : La ligne du premier fichier doit être changée pour correspondre à la ligne du second fichier.
d : La ligne du premier fichier doit être effacée pour correspondre au second fichier.
a : Du contenu supplémentaire doit être ajouté au premier fichier pour qu’il corresponde au second fichier.

4c4 dans notre exemple indique que la ligne quatre de alpha1 doit être modifiée pour correspondre à la ligne quatre de alpha2. C’est la première différence détectée entre les deux fichiers.

Les lignes commençant par < se réfèrent au premier fichier, alpha1, et celles commençant par > se réfèrent au second fichier, alpha2. La ligne > Dave nous indique que le mot Dave est le contenu de la ligne quatre dans alpha2. En résumé, nous devons remplacer Delta par Dave à la ligne quatre dans alpha1 pour que cette ligne soit identique dans les deux fichiers.

La modification suivante est indiquée par 12c12. En utilisant la même logique, cela nous indique que la ligne 12 de alpha1 contient le mot Lima, mais que la ligne 12 de alpha2 contient le mot Linux.

Le troisième changement concerne une ligne qui a été supprimée de alpha2. L’étiquette 21d20 se lit comme suit : « la ligne 21 doit être supprimée du premier fichier pour que les deux fichiers se synchronisent à partir de la ligne 20 ».

La quatrième différence est notée 26a26,28. Ce changement se réfère à trois lignes supplémentaires qui ont été ajoutées à alpha2. Notez 26,28 dans l’étiquette. Les nombres sur deux lignes, séparés par une virgule, représentent une plage de numéros de ligne. Dans cet exemple, la plage s’étend de la ligne 26 à la ligne 28. L’étiquette s’interprète comme suit : « à la ligne 26 du premier fichier, ajoutez les lignes 26 à 28 du second fichier ». Nous voyons les trois lignes de alpha2 qui doivent être ajoutées à alpha1. Elles contiennent les mots Quirk, Strange et Charm.

Opérations rapides

Si vous souhaitez simplement savoir si deux fichiers sont identiques, utilisez l’option -s (afficher les fichiers identiques).

diff -s alpha1 alpha3

Vous pouvez utiliser l’option -q (concis) pour obtenir une déclaration aussi succincte sur deux fichiers différents.

diff -q alpha1 alpha2

Il est important de noter qu’avec deux fichiers identiques, l’option -q (concis) ne renvoie aucune sortie.

Une présentation alternative

L’option -y (côte à côte) utilise une mise en page différente pour présenter les différences entre les fichiers. Il est souvent pratique d’utiliser l’option -W (largeur) avec la vue côte à côte pour limiter le nombre de colonnes affichées. Cela évite les retours à la ligne disgracieux qui rendent la sortie difficile à lire. Ici, nous demandons à diff de générer un affichage côte à côte et de limiter la sortie à 70 colonnes.

diff -y -W 70 alpha1 alpha2

Le premier fichier de la ligne de commande, alpha1, est affiché à gauche et le second, alpha2, est affiché à droite. Les lignes de chaque fichier sont affichées côte à côte. Des caractères indicateurs sont placés à côté des lignes de alpha2 qui ont été modifiées, supprimées ou ajoutées.

| : Une ligne qui a été modifiée dans le second fichier.
< : Une ligne qui a été supprimée du second fichier.
> : Une ligne qui a été ajoutée au second fichier et qui n’est pas présente dans le premier fichier.

Si vous préférez un résumé côte à côte plus compact des différences entre les fichiers, utilisez l’option --suppress-common-lines. Cela force diff à afficher uniquement les lignes modifiées, ajoutées ou supprimées.

diff -y -W 70 --suppress-common-lines alpha1 alpha2

Ajouter de la couleur

Un autre outil, nommé colordiff, ajoute une mise en évidence colorée à la sortie de diff. Cela facilite grandement l’identification des lignes qui présentent des différences.

Pour installer ce paquet sur votre système si vous utilisez Ubuntu ou une autre distribution basée sur Debian, utilisez apt-get. Sur les autres distributions Linux, utilisez l’outil de gestion de paquets propre à votre distribution.

sudo apt-get install colordiff

Utilisez colordiff de la même manière que vous utilisez diff.

En réalité, colordiff est un wrapper pour diff, et c’est diff qui effectue le travail en arrière-plan. C’est pourquoi toutes les options de diff sont compatibles avec colordiff.

Fournir du contexte

Pour trouver un juste milieu entre l’affichage de toutes les lignes des fichiers à l’écran et la liste des seules lignes modifiées, nous pouvons demander à diff de fournir un contexte. Il y a deux façons de faire cela. Les deux méthodes ont le même objectif : afficher quelques lignes avant et après chaque ligne modifiée. Vous pourrez ainsi voir ce qui se passe dans le fichier à l’endroit où la différence a été détectée.

La première méthode utilise l’option -c (contexte copié).

colordiff -c alpha1 alpha2

La sortie de diff comporte un en-tête. Cet en-tête liste les deux noms de fichiers et leurs heures de modification. Il y a des astérisques avant le nom du premier fichier et des tirets (-) avant le nom du second fichier. Ces astérisques et ces tirets seront utilisés pour indiquer à quel fichier appartiennent les lignes de la sortie.

Une ligne d’astérisques avec 1,7 au milieu indique que nous examinons les lignes de alpha1. Pour être plus précis, nous examinons les lignes un à sept. Le mot Delta est marqué comme modifié. Il est précédé d’un point d’exclamation (!) et est coloré en rouge. Trois lignes de texte non modifié sont affichées avant et après cette ligne pour que nous puissions voir le contexte de cette ligne dans le fichier.

La ligne de tirets avec 1,7 au milieu nous indique que nous examinons maintenant les lignes de alpha2. Là encore, nous examinons les lignes un à sept, le mot Dave à la ligne quatre étant indiqué comme différent.

colordiff -C 2 alpha1 alpha2

Sortie de colordiff avec l’option -C 2

colordiff -u alpha1 alpha2

Sortie de colordiff avec l’option -u

Comme précédemment, la sortie comporte un en-tête. Les deux fichiers sont nommés et leurs heures de modification sont affichées. Des tirets (-) précèdent le nom de alpha1 et des signes plus (+) précèdent le nom de alpha2. Cela nous indique que les tirets seront utilisés pour faire référence à alpha1, et que les signes plus seront utilisés pour faire référence à alpha2. Des lignes qui commencent par des signes (@) sont dispersées dans la liste. Ces lignes marquent le début de chaque différence. Elles nous indiquent également quelles lignes sont affichées à partir de chaque fichier.

On nous montre les trois lignes avant et après la ligne marquée comme différente, pour que nous puissions voir le contexte de la ligne modifiée. Dans la vue unifiée, les lignes présentant des différences sont affichées les unes au-dessus des autres. La ligne d’alpha1 est précédée d’un tiret, et la ligne d’alpha2 est précédée d’un signe plus. Cette présentation réalise en huit lignes ce que la présentation contextuelle copiée ci-dessus réalisait en quinze lignes.

colordiff -U 2 alpha1 alpha2

Sortie de colordiff avec l’option -U 2

Ignorer les espaces blancs et la casse

colordiff -y -W 70 test4 test5

Sortie de colordiff sur les fichiers test4 et test5

Les résultats montrent que diff ne détecte aucune différence dans les lignes Black Widow, Spider-Man et Thor. Il signale des modifications dans les lignes Captain America, Ironman et The Hulk.

Alors, quelles sont les différences ? Dans test5, Hulk est écrit avec un « h » minuscule, et Captain America a un espace supplémentaire entre Captain et America. Bien, c’est facile à voir, mais qu’est-ce qui ne va pas avec la ligne Ironman ? Il n’y a aucune différence visible. Voici une règle d’or : si vous ne voyez rien, la réponse est un espace blanc. Il y a presque certainement un ou deux espaces parasites, ou un caractère de tabulation, à la fin de cette ligne.

Si ces différences ne sont pas importantes pour vous, vous pouvez demander à diff d’ignorer certains types de différences, notamment :
-i : ignore les différences de casse.
-Z : ignore les espaces blancs de fin de ligne.
-b : ignore les modifications de la quantité d’espace blanc.

-w : ignore tous les changements d’espaces blancs.

colordiff -i -y -W 70 test4 test5

La sortie de colordiff en ignorant la casse.

colordiff -i -Z -y -W 70 test4 test5

La sortie de colordiff en ignorant les espaces blancs de fin de ligne.

colordiff -i -w -y -W 70 test4 test5

La sortie de colordiff en ignorant tous les espaces blancs.

En demandant à diff d’ignorer les différences qui ne nous intéressent pas, diff nous indique que, pour nos besoins, les fichiers correspondent. La commande diff comporte de nombreuses autres options, mais la plupart d’entre elles concernent la génération d’une sortie lisible par machine. Ces options peuvent être consultées sur la page de manuel Linux.

Les options que nous avons utilisées dans les exemples ci-dessus vous permettront de retrouver toutes les différences entre les versions de vos fichiers texte, en utilisant la ligne de commande et l’analyse visuelle.