Introduction
Dans cet atelier, nous allons explorer la commande diff, un outil indispensable pour les développeurs de logiciels et les administrateurs système travaillant sous Linux. La commande diff est utilisée pour comparer le contenu de deux fichiers et mettre en évidence les différences entre eux. Cette compétence est particulièrement précieuse lors de la gestion des versions de code, de la révision des modifications dans les fichiers de configuration ou de l'identification d'écarts dans des données textuelles.
Nous allons simuler un scénario de développement logiciel où vous utiliserez la commande diff pour comparer différentes versions de fichiers, ce qui vous aidera à comprendre comment cette commande peut être appliquée dans des situations réelles.
Comprendre l'utilisation de base de diff
Commençons par comparer deux fichiers texte simples pour comprendre la sortie de base de la commande diff.
Tout d'abord, naviguez vers le répertoire du projet :
cd /home/labex/project
Maintenant, utilisons la commande diff pour comparer deux fichiers :
diff file1.txt file2.txt
Vous devriez voir une sortie similaire à celle-ci :
1,2c1,2
< This is version 1 of the file.
< It contains some initial content.
---
> This is version 2 of the file.
> It contains updated content.
4c4
< This is the fourth line.
---
> This is a modified fourth line.
Analysons cette sortie :
- Les numéros (comme
1,2c1,2) indiquent les numéros de ligne dans les deux fichiers où les changements se produisent. - La lettre
csignifie "change" (modification). Les autres lettres possibles sontapour "add" (ajout) etdpour "delete" (suppression). - Les lignes commençant par
<proviennent du premier fichier (file1.txt). - Les lignes commençant par
>proviennent du second fichier (file2.txt). - Les tirets
---séparent le contenu du premier fichier de celui du second.
Cette sortie nous indique que :
- Les lignes 1 et 2 des deux fichiers sont différentes.
- La ligne 4 des deux fichiers est différente.
- La ligne 3 (non affichée dans la sortie) est identique dans les deux fichiers.
Comparaison de scripts Python
Appliquons maintenant la commande diff à un scénario plus réaliste. Imaginez que vous travaillez sur un script Python et que vous souhaitez comparer deux versions.
Tout d'abord, visualisons le contenu des deux versions du script :
cat script_v1.py
Vous devriez voir :
def greet(name):
print("Hello, " + name + "!")
def main():
name = input("Enter your name: ")
greet(name)
if __name__ == "__main__":
main()
Regardons maintenant la deuxième version :
cat script_v2.py
Vous devriez voir :
def greet(name):
print(f"Hello, {name.capitalize()}!")
def main():
name = input("Enter your name: ")
greet(name)
print("Thank you for using this script!")
if __name__ == "__main__":
main()
Utilisons maintenant diff pour comparer ces scripts :
diff script_v1.py script_v2.py
Vous devriez voir une sortie similaire à celle-ci :
2c2
< print("Hello, " + name + "!")
---
> print(f"Hello, {name.capitalize()}!")
6a7
> print("Thank you for using this script!")
Cette sortie nous indique :
- La ligne 2 a été modifiée. La salutation utilise désormais une f-string et met une majuscule au nom.
- Une nouvelle ligne (ligne 7 dans la nouvelle version) a été ajoutée avec un message de remerciement.
Utilisation du format unifié
Le format unifié (option -u) offre une sortie plus lisible, particulièrement pour les fichiers volumineux ou lorsque le contexte est important.
Comparez les scripts Python en utilisant le format unifié :
diff -u script_v1.py script_v2.py
Vous devriez voir une sortie similaire à celle-ci :
--- script_v1.py 2023-12-28 10:00:00.000000000 +0000
+++ script_v2.py 2023-12-28 10:05:00.000000000 +0000
@@ -1,8 +1,9 @@
def greet(name):
- print("Hello, " + name + "!")
+ print(f"Hello, {name.capitalize()}!")
def main():
name = input("Enter your name: ")
greet(name)
+ print("Thank you for using this script!")
if __name__ == "__main__":
Analysons cette sortie :
- Les deux premières lignes indiquent les fichiers comparés et leurs horodatages.
- Les lignes commençant par
-proviennent du premier fichier (script_v1.py). - Les lignes commençant par
+proviennent du second fichier (script_v2.py). - Les lignes sans
-ni+fournissent le contexte et sont inchangées entre les fichiers. - La ligne
@@ -1,8 +1,9 @@indique que nous visualisons les lignes 1 à 8 du premier fichier et les lignes 1 à 9 du second.
Ce format est souvent privilégié car il offre plus de contexte autour des modifications.
Ignorer les changements d'espaces blancs
Parfois, les différences d'espaces blancs (espaces, tabulations) ne sont pas significatives. L'option -w demande à diff d'ignorer ces changements.
Créons une nouvelle version de notre script avec quelques modifications d'espaces :
Remarques : Vous devez ajouter des espaces manuellement dans le script, car le copier-coller du code pourrait ne pas conserver les espaces blancs spécifiques.
cat > script_v3.py << EOF
def greet(name):
print(f"Hello, {name.capitalize()}!")
def main():
name = input("Enter your name: ")
greet(name)
print("Thank you for using this script!")
if __name__ == "__main__":
main()
EOF
Maintenant, comparons script_v2.py et script_v3.py, d'abord sans puis avec l'option -w :
diff script_v2.py script_v3.py
Vous pourriez voir des différences dues aux espaces. Essayez maintenant :
diff -w script_v2.py script_v3.py
Vous ne devriez voir aucune sortie, ce qui indique qu'il n'y a aucune différence lorsque les espaces blancs sont ignorés.
C'est très utile lorsque vous voulez vous concentrer sur les changements de contenu plutôt que sur les différences de formatage.
Comparaison de répertoires
La commande diff peut également comparer des répertoires entiers. Créons deux répertoires avec quelques fichiers et comparons-les.
Créez les répertoires et les fichiers :
echo "This is a file in dir1" > dir1/file.txt
echo "This is a file in dir2" > dir2/file.txt
echo "This file is unique to dir1" > dir1/unique1.txt
echo "This file is unique to dir2" > dir2/unique2.txt
Maintenant, comparez les répertoires :
diff -r dir1 dir2
Vous devriez voir une sortie similaire à celle-ci :
Only in dir1: unique1.txt
Only in dir2: unique2.txt
diff -r dir1/file.txt dir2/file.txt
1c1
< This is a file in dir1
---
> This is a file in dir2
Cette sortie nous indique :
dir1contient un fichier nomméunique1.txtqui n'existe pas dansdir2.dir2contient un fichier nomméunique2.txtqui n'existe pas dansdir1.- Le fichier
file.txtexiste dans les deux répertoires mais possède un contenu différent.
L'option -r permet à diff de comparer récursivement les sous-répertoires, ce qui est utile pour comparer des structures de répertoires complexes.
Résumé
Dans cet atelier, nous avons exploré la commande Linux diff dans un contexte de développement logiciel. Nous avons appris à :
- Comparer deux fichiers texte et interpréter la sortie de base de
diff. - Comparer différentes versions de scripts Python.
- Utiliser le format unifié pour une sortie plus lisible.
- Ignorer les changements d'espaces blancs lors des comparaisons.
- Comparer des répertoires entiers de manière récursive.
D'autres options de diff non abordées dans cet atelier incluent :
-y: Comparaison côte à côte (side-by-side).-i: Ignorer la casse (différences majuscules/minuscules).-b: Ignorer les changements dans la quantité d'espaces blancs.-B: Ignorer les changements dont les lignes sont toutes vides.-q: Signaler uniquement si les fichiers diffèrent, sans afficher les détails.
Ces options peuvent être combinées pour obtenir des comparaisons plus spécifiques.



