La commande Diff sous Linux est utilisée pour comparer le contenu de deux fichiers ligne par ligne et si la différence est trouvée, elle répertorie également les différences avec les numéros de ligne. La commande Diff peut également être utilisée pour comparer le contenu de deux répertoires.
La commande Diff joue un rôle important dans le script shell où nous voulons exécuter une commande basée sur la différence de deux fichiers.
syntaxe de la commande diff
$ diff
La sortie de la commande diff peut être au format suivant :
- Normal (par défaut)
- Contexte
- Unifié
Différents symboles de sortie de la commande diff :
- a -> cela indique que quelque chose a été ajouté
- c -> cela indique qu'un texte a été modifié
- d -> cela indique qu'un texte a été supprimé
Par défaut, la commande diff affiche la sortie au format normal, cela signifie que lorsque le contenu de deux fichiers est identique, il ne produira aucune sortie mais nous obtiendrons l'invite.
Dans cet article, nous discuterons de la commande diff avec des exemples pratiques.
1) Comparez deux fichiers avec la commande diff
Supposons que nous ayons deux fichiers aachen.txt et sydney.txt et voici le contenu de ces fichiers,
[[email protected] ~]# cat aachen.txt Linux Rocks in the open source world, followings are the linux distributions: CentOS Red Hat Ubuntu Debian Linux Mint OpenSUSE Fedora [[email protected] ~]# cat sydney.txt Linux Rocks in the open source world, followings are the linux distributions: CentOS Red Hat Ubuntu Debian Linux Mint OpenSUSE Fedora [[email protected] ~]#
Comparons le contenu de ces fichiers en utilisant la commande diff,
[[email protected] ~]# diff aachen.txt sydney.txt [[email protected] ~]#
La sortie ci-dessus confirme que les deux fichiers sont identiques. Apportons quelques modifications à aachen.txt, réécrivons l'open source en "open-source".
Maintenant, relancez la commande diff,
[[email protected] ~]# diff aachen.txt sydney.txt
Sortie,
Dans la sortie, 1c1 indique que la 1ère ligne du premier fichier doit être modifiée pour rendre les deux fichiers identiques.
Annulons la modification ci-dessus et ajoutons une nouvelle ligne "Arch Linux " dans sydeny.txt à la fin du fichier et exécutez à nouveau la commande diff,
Sortie de la commande diff "7a8 " indique qu'après la 7ème ligne du premier fichier, nous devons ajouter une autre ligne pour correspondre à la 8ème ligne du deuxième fichier.
Supprimons "Arch Linux" et "Fedora" de sydney.txt puis essayons de comparer ces fichiers,
Sortie de la commande diff "7d6 " indique que nous devons supprimer la 7ème ligne du premier fichier pour synchroniser avec le deuxième fichier à la ligne numéro 6.
2) Sortie de la commande Diff au format contextuel (-c)
Utilisez l'option '-c' dans la commande diff pour produire la sortie de la commande diff au format contextuel. L'exemple est montré ci-dessous,
[[email protected] ~]# diff -c aachen.txt sydney.txt
Les deux premières lignes représentent les noms de fichiers ainsi que leur date et heure de modification et trois astérisques (“*** “) indique le premier fichier et trois tirets (“— ") indique le deuxième fichier.
Un seul trait d'union "-" indique que la ligne doit être supprimée et le symbole plus "+" indique que la ligne doit être ajoutée dans le fichier. Si une ligne ne nécessite aucun changement, elle est précédée de deux espaces.
3) Sortie de la commande Diff au format unifié (-u)
Utilisez l'option '-u' dans la commande diff si vous souhaitez produire sa sortie dans un format unifié, l'exemple est illustré ci-dessous,
[[email protected] ~]# diff -u aachen.txt sydney.txt
La sortie ci-dessus est quelque peu similaire au format contextuel mais le format unifié affiche la sortie de manière concise, ici les deux premières lignes indiquent les noms de fichiers ainsi que leur date et heure de modification..
Trois traits d'union ("—") représentent le premier fichier et trois symboles plus ("+++") représentent le deuxième fichier, après deux signes @ "-1,7" indique les lignes du 1er fichier et "+1,7" représente les lignes vont du 2ème fichier. De plus, le symbole (+Core OS) indique que cette ligne doit être ajoutée dans le premier fichier et le trait d'union de symbole (-Fedora) indique que cette ligne doit être supprimée du premier fichier pour la rendre identique au 2e fichier.
4) Ignorer la casse lors de la comparaison de fichiers (-i)
Par défaut, la commande diff est sensible à la casse et si vous souhaitez ignorer la casse dans la commande diff, utilisez l'option "-i", l'exemple est illustré ci-dessous,
Supposons que nous avons le contenu suivant de deux fichiers
Exécutez la commande diff sans aucune option,
[[email protected] ~]# diff aachen.txt sydney.txt 5,6c5,6 < Ubuntu debian < Linux mint --- > Ubuntu Debian > Linux Mint [[email protected] ~]#
Exécutez maintenant la commande diff avec l'option -i,
[[email protected] ~]# diff -i aachen.txt sydney.txt [[email protected] ~]#
Comme nous pouvons le voir dans la sortie ci-dessus, la commande diff a ignoré la fonctionnalité sensible à la casse lorsque nous utilisons l'option -i.
5) Les fichiers de rapport sont identiques avec la commande diff (-s)
Il peut y avoir des situations où nous comparons les fichiers à l'aide de la commande diff et si le contenu est identique, nous voulons afficher le message indiquant que le fichier est identique, cela peut être accompli en passant l'option '-s' dans la commande diff,
[[email protected] ~]# cat filex.txt DevOPs Engineer Cloud Stack Engineer Linux System Admin Monitoring Team [[email protected] ~]# cat filey.txt DevOPs Engineer Cloud Stack Engineer Linux System Admin Monitoring Team [[email protected] ~]# diff -s filex.txt filey.txt Files filex.txt and filey.txt are identical [[email protected] ~]#
6) Ignorer les espaces lors de la comparaison de fichiers avec diff (-b)
Supposons que nous ayons deux fichiers filea.txt et fileb.txt où les espaces blancs ne sont pas cohérents, donc si nous utilisons la commande diff sans aucune option, cela montrera la différence d'espace blanc même si le contenu est identique, donc dans de tels cas, nous pouvons ignorer les espaces blancs incohérents dans la commande diff en utilisant l'option -b , exemple est illustré ci-dessous,
[[email protected] ~]# cat filea.txt Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks. [[email protected] ~]# cat fileb.txt Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks. [[email protected] ~]#
Comparez les fichiers sans aucune option avec la commande diff,
[[email protected] ~]# diff filea.txt fileb.txt 1c1 < Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks. --- > Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks. [[email protected] ~]#
Utilisez maintenant l'option -b dans la commande diff ci-dessus
[[email protected] ~]# diff -b filea.txt fileb.txt [[email protected] ~]#
Si vous souhaitez ignorer tous les espaces blancs lors de la comparaison à l'aide de la commande diff, utilisez "-w option ”
[[email protected] ~]# diff -w filea.txt fileb.txt
7) Ignorer l'espace blanc à la fin de la ligne lors de la comparaison (-Z)
Si vous souhaitez ignorer l'espace d'essai à la fin de la ligne pendant la comparaison, utilisez "-Z option ”
[[email protected] ~]# diff -Z filea.txt fileb.txt
Utilisez "-B ” dans la commande diff pour ignorer toutes les lignes vides lors de la comparaison,
[[email protected] ~]# diff -B filea.txt fileb.txt
8) Comparer deux répertoires
Supposons que nous ayons deux répertoires avec le nom lab01 et lab02, ceux-ci ont les fichiers et sous-répertoires suivants
[[email protected] ~]# ls -l lab01/ total 0 -rw-r--r--. 1 root root 0 Feb 1 17:49 filea.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 fileb.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 filec.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 filed.txt drwxr-xr-x. 2 root root 23 Feb 1 17:50 sitea [[email protected] ~]# ls -l lab02/ total 0 -rw-r--r--. 1 root root 0 Feb 1 17:49 filea.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 fileb.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 filec.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 filed.txt drwxr-xr-x. 2 root root 23 Feb 1 17:50 sitea [[email protected] ~]#
Comparons ces deux répertoires en utilisant la commande diff ci-dessous,
[[email protected] ~]# diff -qr lab01/ lab02/ [[email protected] ~]#
Où :
- -q -> il demande à la commande diff de signaler uniquement lorsque les fichiers sont différents
- -r -> il demande à la commande diff de rechercher les différences dans les sous-répertoires de manière récursive
Comme nous obtenons une sortie vide, cela signifie que les deux répertoires sont identiques. Supprimons file.txt de lab02 puis essayons de comparer,
[[email protected] ~]# cd lab02/ [[email protected] lab02]# rm -f filed.txt [[email protected] lab02]# cd [[email protected] ~]# diff -qr lab01/ lab02/ Only in lab01/: filed.txt [[email protected] ~]#
La sortie ci-dessus indique que file.txt n'est présent que dans le répertoire lab01
9) Redirection de la sortie de la commande diff vers un fichier
La sortie de la commande Diff peut être redirigée vers un fichier en utilisant le symbole ">". Cela devient très utile dans les scripts shell où nous voulons effectuer une tâche uniquement si la sortie de la commande diff contient des différences.
[[email protected] ~]# diff aachen.txt sydney.txt 9,10d8 < SLES < Puppy Linux [[email protected] ~]# diff aachen.txt sydney.txt > diff.txt [[email protected] ~]# cat diff.txt 9,10d8 < SLES < Puppy Linux [[email protected] ~]#
Exemple supplémentaire
Comparer deux fichiers sur le terminal côte à côte
Lorsque nous utilisons l'option '-y' tout en comparant deux fichiers à l'aide de la commande diff, les deux fichiers sont affichés côte à côte sur le terminal.
[[email protected] ~]# diff -y /etc/fstab /tmp/fstab
sortie
La sortie ci-dessus montre clairement la différence entre deux fichiers.
C'est tout de cet article, j'espère que vous avez maintenant une meilleure compréhension de la commande diff en parcourant les exemples ci-dessus. N'hésitez pas à partager vos retours et commentaires.
Lire aussi :16 exemples de commandes Echo sous Linux
Lire aussi : 8 exemples de commandes Head sous Linux