GNU/Linux >> Tutoriels Linux >  >> Linux

Comment effectuer une comparaison ligne par ligne de fichiers sous Linux à l'aide de la commande diff - Partie II

Dans la première partie de cette série de didacticiels sur la commande diff, nous avons abordé les bases de la commande, y compris son fonctionnement et la manière dont la sortie qu'elle produit peut être comprise. Bien qu'il y ait certainement un peu de courbe d'apprentissage avec cet utilitaire de ligne de commande, cela vaut la peine d'apprendre, surtout si votre travail quotidien implique d'effectuer des tâches liées aux fichiers sur des machines Linux CLI uniquement.

En supposant que vous connaissiez déjà l'utilisation de base de la commande diff, dans ce didacticiel, nous aborderons les différentes options de ligne de commande fournies par l'outil, à travers des exemples faciles à comprendre.

Mais avant de continuer, gardez à l'esprit que tous les exemples de ce didacticiel ont été testés sur Ubuntu 14.04 avec Bash version 4.3.11(1) et diff version 3.3.

 

Options de la commande Diff

1. Signaler lorsque les fichiers sont identiques

Par défaut, lorsque la commande diff détecte que les fichiers comparés sont identiques, elle ne produit aucune sortie.

$ diff file1 file2
$

Mais, il existe une option de ligne de commande (-s) à l'aide de laquelle vous pouvez forcer la commande à signaler cela dans la sortie :

$ diff -s file1 file2
Files file1 and file2 are identical

2. Contexte copié et contexte unifié

Ce sont essentiellement deux formats différents dans lesquels la commande diff peut produire sa sortie. Le contexte copié est activé à l'aide de l'option de ligne de commande -c, tandis que le contexte unifié est activé à l'aide de -u. Voici un exemple du premier :

$ diff -c file1 file2
*** file1 2016-12-29 09:36:47.175597647 +0530
--- file2 2016-12-29 09:19:55.799558326 +0530
***************
*** 1,3 ****
Hi
! Helllo
Bye
--- 1,3 ----
Hi
! Hello
Bye

Ainsi, dans le format de sortie du contexte copié, les différentes lignes sont indiquées par un point d'exclamation (!).

Et voici l'exemple du format de contexte unifié :

$ diff -u file1 file2
--- file1 2016-12-29 09:36:47.175597647 +0530
+++ file2 2016-12-29 09:19:55.799558326 +0530
@@ -1,3 +1,3 @@
Hi
-Helllo
+Hello
Bye

Dans ce format de sortie, + et - les symboles avant les lignes indiquent les versions de la ligne différente : '-' lorsque la ligne dans le fichier1 est absent du fichier2 , '+' lorsque la ligne dans le fichier2 a été ajouté au fichier1.

3. Sortie d'un script 'ed'

La commande diff est également capable de produire des commandes que l'éditeur 'ed' peut utiliser pour convertir le fichier d'origine (fichier1 dans nos exemples ici) dans le nouveau fichier (fichier2). Voici comment procéder :

Supposons que file1 et file2 contiennent la modification suivante :

$ diff file1 file2
2c2
< Helllo
---
> Hello

Maintenant, utilisez l'option de ligne de commande -e pour produire la sortie que l'éditeur 'ed' comprend et redirigez cette sortie dans un fichier :

diff -e file1 file2 > out

Voici ce qui sort contient dans ce cas :

2c
Hello
.

Ce que vous devez ensuite ajouter la commande 'w' à la fin de la out fichier.

2c
Hello
.
w

Maintenant, exécutez la commande suivante :

ed - file1 < out

Et vous verrez que file1 et file2 sont maintenant identiques.

$ diff file1 file2
$

Pour plus d'informations sur cette fonctionnalité, rendez-vous ici.

4. Produire une sortie en deux colonnes

Normalement, la commande diff produit une sortie de la manière suivante :

$ diff file1 file2
2c2
< Helllo
---
> Hello

Mais il existe une option de ligne de commande (-y) qui ordonne à diff de produire une sortie dans deux colonnes distinctes. Voici un exemple :

$ diff -y file1 file2
Hi                               Hi
Helllo                         | Hello
Bye                              Bye

Comme vous pouvez le voir, ce format de sortie utilise un '|' pour indiquer les lignes qui sont différentes.

5. Masquer les lignes communes

Si vous observez la sortie montrée dans la section précédente (point 4 ci-dessus), vous remarquerez qu'avec -y option de ligne de commande, diff - dans la sortie - produit également des lignes communes. Si vous avez besoin de supprimer ces lignes identiques, vous pouvez utiliser --suppress-common-lines option.

[email protected]:~$ diff -y --suppress-common-lines file1 file2
Helllo                                   | Hello

6. Afficher la fonction C dans laquelle se trouve chaque modification 

Dans les cas où vous utilisez diff pour comparer deux fichiers de langage C, il existe une option de ligne de commande (-p) qui demande à l'utilitaire d'afficher précisément dans quelle fonction C se trouve chaque modification. Par exemple, supposons qu'il s'agisse des deux fichiers C :

fichier1.c :

#include<stdio.h>

void compare(float x, float y)
{
if(x == y) // incorrect way
{
printf("\n EQUAL \n");
}
}


int main(void)
{
compare(1.234, 1.56789);

return 0;
}

fichier2.c :

#include<stdio.h>

void compare(float x, float y)
{
if(x == y)
{
printf("\n EQUAL \n");
}
}


int main(void)
{
compare(1.234, 1.56789);

return 0;
}

Voici le résultat lorsque les deux fichiers sont comparés normalement :

$ diff file1.c file2.c 
5c5
< if(x == y) // incorrect way
---
> if(x == y)

Et voici la sortie, lorsque les fichiers sont comparés à l'aide de -p choix :

$ diff -p file1.c file2.c 
*** file1.c 2016-12-29 11:45:36.587010816 +0530
--- file2.c 2016-12-29 11:46:39.823013274 +0530
***************
*** 2,8 ****

void compare(float x, float y)
{
! if(x == y) // incorrect way
{
printf("\n EQUAL \n");
}
--- 2,8 ----

void compare(float x, float y)
{
! if(x == y)
{
printf("\n EQUAL \n");
}

Donc, comme vous pouvez le voir, avec -p , diff vous donne un aperçu plus détaillé de l'emplacement du changement, en indiquant les différentes lignes à l'aide d'un point d'exclamation (!).

7. Comparer récursivement les sous-répertoires

La commande diff vous permet également de comparer les sous-répertoires de manière récursive, mais ce n'est pas son comportement par défaut. Ce que je veux dire, c'est que si vous prenez le cas suivant :

$ diff diff-files/ second-diff-files/
diff diff-files/file1 second-diff-files/file1
1c1
< Hi
---
> i
diff diff-files/file2 second-diff-files/file2
2c2
< Hello
---
> ello

La commande diff n'a comparé que les fichiers des répertoires de niveau supérieur, mais si vous utilisez l'option de ligne de commande -r (qui est pour les différences récursives), vous verrez que même les fichiers présents dans les sous-répertoires sont comparés :

$ diff -r diff-files/ second-diff-files/
diff -r diff-files/file1 second-diff-files/file1
1c1
< Hi
---
> i
diff -r diff-files/file2 second-diff-files/file2
2c2
< Hello
---
> ello
diff -r diff-files/more-diff-files/file1 second-diff-files/more-diff-files/file1
1c1
< Hi
---
> i
diff -r diff-files/more-diff-files/file2 second-diff-files/more-diff-files/file2
2c2
< Hello
---
> ello

8. Traiter les fichiers absents comme vides

La commande diff fournit également une option à l'aide de laquelle vous pouvez demander à l'outil de traiter les fichiers absents comme vides. Par exemple, si vous comparez fichier1 avec fichier3 (qui n'existe pas), le comportement par défaut de diff est de produire une erreur :

$ diff file1 file3
diff: file3: No such file or directory

Ce n'est pas faux en soi; en fait, cela est parfaitement logique. Mais il peut y avoir des cas où vous ne voudriez pas que la commande diff génère une erreur dans de telles situations (tout en faisant partie d'un script bash, peut-être ?), alors pour ces scénarios, vous pouvez utiliser l'option de ligne de commande -N qui force la commande à traiter les fichiers absents comme vides et à poursuivre la comparaison.

$ diff -N file1 file3
1,5d0
< Hi
<
< Helllo
<
< Bye

Conclusion

Si vous parcourez correctement les deux parties de cette série de didacticiels et pratiquez tous les exemples contenus dans les articles, il ne sera pas exagéré de dire que vous finirez par avoir une bonne maîtrise de l'outil. Bien sûr, nous n'avons pas pu discuter de tout ce qui concerne les différences dans cette série, mais soyez assuré que de nombreuses caractéristiques/fonctionnalités importantes ont été couvertes.

Pour ceux qui souhaitent en savoir plus sur l'utilitaire, la page de manuel est toujours là pour vous. Et sans oublier que vous devez continuer à utiliser l'outil fréquemment avec différents ensembles de fichiers afin de simuler différents cas d'utilisation.


Linux
  1. Comment redémarrer Linux en utilisant la ligne de commande

  2. Comment compresser et extraire des fichiers à l'aide de la commande tar sous Linux ?

  3. Comment trier des fichiers sous Linux à l'aide de la commande Sort

  4. Comment créer des fichiers fragmentés sous Linux à l'aide de la commande "dd"

  5. Comment afficher les fichiers cachés à l'aide de la commande Linux "find"

Comment renommer des fichiers en utilisant la ligne de commande sous Linux

Comment comparer des fichiers sous Linux à l'aide de l'outil Meld (Diff/Merge)

Comment copier des fichiers sous Linux à l'aide de la commande CP

Comment compter les fichiers dans le répertoire sous Linux

Utilisation de la commande Diff pour comparer deux fichiers dans un terminal Linux

Comment télécharger des fichiers dans Rocky Linux 8 sur la ligne de commande à l'aide de wget