Comment comparer les fichiers à l'aide de Diff

Comment comparer les fichiers à l'aide de Diff

L'utilitaire DIFF est, dans la grande majorité des cas, installée par défaut dans chaque distribution Linux. Le programme est utilisé pour calculer et afficher les différences entre le contenu de deux fichiers. Il est principalement utilisé pour travailler avec le code source deux, comparez les mêmes versions de deux fichiers et mettent en surbrillance les différences entre elles. Dans cet article, nous apprendrons les différents modes dans lesquels Diff peut fonctionner et comment créer un fichier Diff qui peut être appliqué plus tard comme patch avec l'utilitaire de patch.

Dans ce tutoriel, vous apprendrez:

  • Comment utiliser Diff
  • Comment afficher la sortie de Diff sur deux colonnes lors de l'utilisation de Diff en mode normal
  • Comment lire la sortie diff en mode normal, contexte et unifié
  • Comment créer un fichier Diff et l'appliquer comme un correctif avec l'utilitaire de correctif
Comment comparer les fichiers à l'aide de Diff

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Distribution indépendante
Logiciel Diff, patch
Autre Aucun
Conventions # - nécessite que les commandes Linux sont exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - Exige que les commandes Linux sont exécutées en tant qu'utilisateur non privilégié régulier

L'utilitaire Diff

Le difficulté L'utilitaire compare les fichiers ligne par ligne; Sa syntaxe est très simple:

$ Diff [Option] Fichiers 

Tout ce que nous avons à faire est d'invoquer le programme suivi du chemin des fichiers que nous voulons comparer. Avant de pouvoir jeter un œil à certains exemples d'utilisation, nous devons apprendre à lire la sortie de l'utilitaire, et quelle est la signification des symboles utilisés dans la sortie produite par elle. Nous pouvons les résumer dans le tableau suivant:

Symbole Signification
un Un «ajout» est nécessaire pour que le contenu des deux fichiers puisse correspondre
c Une action «modifier» est nécessaire pour que le contenu des deux fichiers puisse correspondre
d Une action «Supprimer» est nécessaire pour que le contenu des deux fichiers puisse correspondre
< Indique une ligne du premier fichier
> Indique une ligne du deuxième fichier


Nous pouvons maintenant voir quelques exemples de l'utilisation de difficulté de base. Supposons que nous ayons deux fichiers, appelés lOTR0.SMS et lOTR1.SMS. Le contenu du premier fichier est le suivant:

Trois anneaux pour les Elven-Kings sous le ciel, sept pour les nains dans leurs salles de pierre, neuf pour les mortels condamnés à mourir, un pour le Seigneur des Ténèbres sur son trône sombre au pays du Mordor où se trouve les ombres. Une bague pour les gouverner toutes, une bague pour les trouver, une bague pour les amener toutes, et dans l'obscurité les lier, dans le pays du Mordor où les ombres se trouvent # fin 

Vous avez sûrement reconnu le poème «Ring» du livre «Seigneur des Anneaux». Supposons maintenant le deuxième fichier, lOTR1.SMS, Contient à la place les lignes suivantes:

# Le poème du ring dans le discours noir du Mordor trois anneaux pour les Elven-Kings sous le ciel, sept pour les nains dans leurs salles de pierre, neuf pour les mortels condamnés à mourir, un pour le Seigneur des Ténèbres sur son trône sombre Au pays du Mordor où se trouvent les ombres. Ash Nazg Durbatulûk, Ash Nazg Gimbatul, Ash Nazg Thrakatulûk, Agh Burzum-Ishi Krimpatul, au pays du Mordor où se trouve les ombres 

Le contenu des deux fichiers est assez similaire, mais pas identique. Exécutons le difficulté utilité sur eux et voyez quelle sortie il produit:

$ Diff Lotr0.txt LOTR1.txt 0a1> # le poème de la bague dans le discours noir du Mordor 6,7c7,8 < One Ring to rule them all, One Ring to find them,  Ash nazg durbatulûk, ash nazg gimbatul, > Ash Nazg Thrakatulûk, Agh Burzum-Ishi Krimpatul, 9d9 < # end 

Sur la première ligne de la sortie, nous pouvons lire 0a1; Qu'est-ce que cela signifie? Dans ce cas, nous sommes informés que pour le premier fichier pour correspondre au contenu de la seconde, à son début (ligne 0), une nouvelle ligne doit être «ajoutée» (un), qui correspond à la première ligne (1) du deuxième fichier. Qu'est-ce que cette ligne? Celui signalé après le > Symbole sur la deuxième ligne de la sortie:

> # Le poème de la bague dans le discours noir du Mordor 

Cela a du sens: la ligne n'existe pas dans le premier fichier, il doit donc être ajouté pour que le contenu des deux fichiers corresponde.

Nous allons continuer. Nous pouvons voir la notation suivante 6,7c7,8: Cela signifie que les lignes 6 pour 7 Dans le premier fichier (6,7) doit être modifié pour faire correspondre les lignes 7 pour 8 (7,8) int le deuxième fichier. Comment devraient-ils être modifiés? Les lignes du premier fichier, que nous pouvons distinguer car < Symbole, sont:

< One Ring to rule them all, One Ring to find them, < One Ring to bring them all, and in the darkness bind them, 

Ils doivent être changés par les lignes suivantes du deuxième fichier, qui peuvent être repérées car elles sont précédées par le > Symbole dans la sortie diff:

> Ash Nazg Durbatulûk, Ash Nazg Gimbatul,> Ash Nazg Thrakatulûk, Agh Burzum-Ishi Krimpatul, 

Les lignes du premier fichier et les lignes du second, dans la sortie, sont séparées par trois tirets: (---).

Enfin, nous avons le 9d9 NOTATION: Cela signifie que pour que le contenu des deux fichiers puisse correspondre, la ligne 9 dans le premier fichier (# fin) doit être supprimé afin de faire correspondre la ligne 9 du deuxième fichier.

Affichage de la sortie côte à côte

Dans les exemples ci-dessus, nous pouvons voir que la sortie produite par l'utilitaire DIFF est organisée «verticalement». Si nous préférons, nous pouvons faire pour qu'il soit formaté et affiché à l'aide de deux colonnes. Tout ce que nous avons à faire est d'utiliser le -y Option (court
pour --cote à cote):

$ Diff -y LOTR0.txt LOTR1.TXT> # The Ring Poem in the Black Speech of Mordor Three Rings for the Elven-Kings Under the Sky, trois anneaux pour les Elven-Kings sous le ciel, sept pour les nains dans leurs salles de pierre, sept pour le nain -Les dans leurs salles de pierre, neuf pour les mortels condamnés à mourir, neuf pour les mortels condamnés à mourir, un pour le Seigneur des Ténèbres sur son trône sombre pour le Seigneur des Ténèbres sur son trône sombre au pays du Mordor où les ombres mensonge. Au pays du Mordor où se trouvent les ombres. Une bague pour les gouverner toutes, une bague pour les trouver, | Ash Nazg Durbatulûk, Ash Nazg Gimbatul, un anneau pour les amener tous, et dans l'obscurité les liez, | Ash Nazg Thrakatulûk, Agh Burzum-Ishi Krimpatul, dans le pays du Mordor où les ombres se trouvent dans le pays du Mordor où les ombres se trouvent # fin < 

Le contenu du premier fichier s'affiche dans la colonne de gauche, et celle du second, dans la droite. Nous pouvons facilement repérer les différences entre elles: quelles lignes n'existent que dans l'un des deux, et quelles lignes sont différentes. Le -y L'option ne peut être utilisée que lorsque vous travaillez avec Diff en mode «normal», qui est la valeur par défaut. D'autres modes existent: nous en parlons dans la section suivante.

Mode normal, contextuel et unifié

Par défaut, l'utilitaire Diff fonctionne dans normal mode, et produit une sortie similaire à celle que nous avons vue dans les exemples précédents. Il existe cependant deux autres modes que nous pouvons utiliser: le contexte et unifié mode. Nous allons jeter un coup d'oeil
sur eux.

Le mode contexte

Le mode contexte peut être utilisé en invoquant le programme avec le -c Option, (abréviation pour --contexte). Dans notre cas, il produirait la sortie suivante:

$ Diff -c LOTR0.txt LOTR1.txt *** lOTR0.txt 2021-03-13 16:10:25.248286081 +0100 --- LOTR1.txt 2021-03-13 15:30:54.060911632 +0100 *** grâce , Neuf pour les mortels condamnés à mourir, un pour le Seigneur des Ténèbres sur son trône sombre au pays du Mordor où se trouvent les ombres. ! Une bague pour les gouverner toutes, une bague pour les trouver, ! Une bague pour les apporter toutes, et dans l'obscurité les liez, dans le pays du Mordor où se trouvent les ombres - # end --- 1,9 ---- + # le poème de la bague dans le discours noir du Mordor trois anneaux pour Les Elven-Kings sous le ciel, sept pour les nains de nains dans leurs salles de pierre, neuf pour les mortels condamnés à mourir, un pour le Seigneur des Ténèbres sur son trône sombre dans le pays du Mordor où se trouvent les ombres. ! Ash Nazg Durbatulûk, Ash Nazg Gimbatul, ! Ash Nazg Thrakatulûk, Agh Burzum-Ishi Krimpatul, au pays du Mordor où se trouvent les ombres 


Jetons un coup d'œil à ce résultat. Tout d'abord, nous pouvons voir que les deux fichiers sont référencés en utilisant différents symboles: *** pour le premier, et --- pour le second.

Les deux premières lignes fournissent des informations sur les deux fichiers. Nous pouvons voir:

  • Le nom du fichier
  • Le temps de modification du fichier avec le fuseau horaire (+0100 dans ce cas)

Les deux premières lignes sont séparées du reste de la sortie par 15 astérisques (***************).

Ce que nous voyons immédiatement après le séparateur, c'est la notation qui spécifie quelle est la plage de lignes du premier fichier rapporté dans la sortie, dans ce cas, les lignes 1 à 9 (1,9). Après cette notation, les lignes elles-mêmes sont signalées. La même chose se produit pour le deuxième fichier. Nous pouvons voir que certaines lignes sont précédées de certains symboles; Voyons quelle est leur signification:

Symbole Signification
! Les lignes préfixées par ce symbole dans le premier fichier doivent être changées par les lignes précédées dans le deuxième fichier, afin que le contenu des deux fichiers corresponde
- Les lignes précédées de ce symbole dans le premier fichier doivent être supprimées pour que le contenu des deux fichiers puisse correspondre
+ Les lignes du deuxième fichier précédés de ce symbole doivent être ajoutées au premier fichier pour le contenu des deux fichiers à correspondre

Le mode unifié

Pour utiliser le difficulté utilité en mode «unifié», nous devons l'invoquer en utilisant le -u option, qui est la forme courte de --unifié. C'est à quoi ressemblerait la sortie de Diff en mode unifié dans ce cas:

$ diff -u lOTR0.txt LOTR1.txt --- LOTR0.txt 2021-03-13 16:10:25.248286081 +0100 +++ LOTR1.txt 2021-03-13 15:30:54.060911632 +. Pour les mortels condamnés à mourir, un pour le Seigneur des Ténèbres sur son trône sombre au pays du Mordor où se trouvent les ombres. -Une bague pour les gouverner toutes, une bague pour les trouver,-un anneau pour les amener tous, et dans l'obscurité les lier, + Ash Nazg Durbatulûk, Ash Nazg Gimbatul, + Ash Nazg Thrakatulûk, Agh Burzum-Eshi Krimpatul, dans le dans le dans le dans le dans le dans le dans le dans le dans le dans le dans le dans le Terre du Mordor où se trouvent les ombres - # fin 

Les deux premières lignes produites lorsque Diff est invoqué avec le -u L'option est la même du mode «contexte» et affiche des informations sur les deux fichiers. La seule grande différence ici est que la sortie n'est pas séparée en fonction du fichier auquel il appartient: toutes les lignes sont «unifiées».

Création d'un fichier Diff et l'application en tant que patch

Supposons que nous voulons appliquer les modifications nécessaires au contenu du premier fichier que nous avons utilisé dans les exemples précédents, lOTR0.SMS, afin qu'il soit mis à jour pour correspondre au contenu du deuxième fichier, lOTR1.SMS; Comment procéder? Pour atteindre notre objectif, nous pouvons utiliser le correctif utilité et appliquez un fichier de difficulté à l'original. UN fichier de difficulté Contient la sortie de Diff, donc pour en créer un, tout ce que nous avons à faire est de rediriger la sortie de l'utilitaire:

$ diff -u lOTR0.txt LOTR1.txt> lotr.correctif 


Une fois que nous avons notre fichier Diff, nous pouvons appliquer les modifications nécessaires au fichier d'origine à l'aide de l'utilitaire de correctif:

$ Patch -B LOTR0.txt lotr.correctif 

Nous avons invoqué correctif en utilisant le -b Option: Ce n'est pas obligatoire mais est utile car il le fait pour qu'une sauvegarde du fichier d'origine soit créée avant l'application du correctif (dans ce cas, il sera nommé lOTR0.SMS.origine). Les arguments que nous
à condition que:

  • Le nom du fichier d'origine sur lequel le patch doit être appliqué
  • Le nom du fichier contenant le patch.

Une fois le patch appliqué le lOTR0.SMS le fichier doit être identique à lOTR1.SMS. Nous pouvons le vérifier à nouveau en utilisant DIFF, ce qui ne devrait produire pas de sortie:

$ Diff Lotr0.txt LOTR1.SMS 

Conclusions

Dans ce tutoriel, nous apprenons à utiliser Diff pour calculer les différences entre deux fichiers. Nous avons vu quels sont les modes dans lesquels Diff peut être utilisé et quelle est la signification des symboles utilisés dans la sortie diff. Enfin, nous avons vu comment créer un fichier diff et comment l'appliquer comme un correctif à l'aide de l'utilitaire de correctif.

Tutoriels Linux connexes:

  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Masterring Bash Script Loops
  • Choses à installer sur Ubuntu 20.04
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Tutoriel de débogage GDB pour les débutants
  • Comment reconstruire un package à l'aide du système de construction Arch Linux
  • Boucles imbriquées dans les scripts bash
  • Comment monter l'image ISO sur Linux
  • Système linux hung? Comment s'échapper vers la ligne de commande et…
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux