La commande diff permet d'identifier les différences entre deux fichiers A et B. L'usage courant étant de rechercher les divergences entres deux versions d'un même fichier afin de produire un patch par exemple. Cette procédure est détaillée dans
Pour illustrer les exemples ci-après, un fichier texte est créé avec du contenu aléatoire via la commande suivante:
$ for i in $( seq 1 8 ); do cat /dev/urandom | tr -C -d [:alnum:] | head -c 30 >> essai.txt; echo "" >> essai.txt; done
On obtient un fichier de la forme suivante:
DXzs9Oq60ULUMQILNo9XHH8WJWWx7E QtR3BldTq6Uy4hIwVRoPJCNQIA1UOd A8ECGIzM72FqPOwEq8gSgFFIoPhbBT 6KYnm0FuWSCUsGCM1l7Fy7uLw8nHjE fF2myE3iVSHpUZ5hImMFK4mPOVdag2 ty0AD2q0GfPjAqK3QR6x7DOzRVIxTo rSoP7edVT8mVxKFydRO74EYNmliEQ0 4Sr87kZpR2rlup4aSM9yXARXfT6hS4
On crée une copie de ce fichier nommée essai2.txt puis on remplace la ligne 4. Le résultat est présenté ci dessous.
DXzs9Oq60ULUMQILNo9XHH8WJWWx7E QtR3BldTq6Uy4hIwVRoPJCNQIA1UOd A8ECGIzM72FqPOwEq8gSgFFIoPhbBT .. La ligne 4 est modifiée .. fF2myE3iVSHpUZ5hImMFK4mPOVdag2 ty0AD2q0GfPjAqK3QR6x7DOzRVIxTo rSoP7edVT8mVxKFydRO74EYNmliEQ0 4Sr87kZpR2rlup4aSM9yXARXfT6hS4
Lorsque diff est invoqué sans autre argument que les fichiers à comparer, il retourne les modifications à apporter pour passer du premier fichier au second:
diff essai.txt essai2.txt
4c4 < 6KYnm0FuWSCUsGCM1l7Fy7uLw8nHjE --- > .. La ligne 4 est modifiée ..
Ici une seule modification doit être apportée. La modification est introduite par une ligne de contexte qui indique sa position et le type de modification à apporter ici 4c4 signifie que:
3 lettres peuvent être utilisées:
La commande précédente n'affiche que les lignes à modifier. On peut utiliser l'argument -c pour afficher le contexte autour de chaque modification.
diff -c essai.txt essai2.txt
*** essai.txt 2022-10-04 12:25:40.247730412 +0200 --- essai2.txt 2022-10-04 14:17:54.477069684 +0200 *************** *** 1,7 **** DXzs9Oq60ULUMQILNo9XHH8WJWWx7E QtR3BldTq6Uy4hIwVRoPJCNQIA1UOd A8ECGIzM72FqPOwEq8gSgFFIoPhbBT ! 6KYnm0FuWSCUsGCM1l7Fy7uLw8nHjE fF2myE3iVSHpUZ5hImMFK4mPOVdag2 ty0AD2q0GfPjAqK3QR6x7DOzRVIxTo rSoP7edVT8mVxKFydRO74EYNmliEQ0 --- 1,7 ---- DXzs9Oq60ULUMQILNo9XHH8WJWWx7E QtR3BldTq6Uy4hIwVRoPJCNQIA1UOd A8ECGIzM72FqPOwEq8gSgFFIoPhbBT ! .. La ligne 4 est modifiée .. fF2myE3iVSHpUZ5hImMFK4mPOVdag2 ty0AD2q0GfPjAqK3QR6x7DOzRVIxTo rSoP7edVT8mVxKFydRO74EYNmliEQ0
Par défaut le contexte affiche 3 lignes précédant la modification et 3 lignes la succédant.
Pour les fichiers relativement petits l'option -c permet d'afficher le contenu des fichiers sur la sortie standard avec les indicateurs en préfixe des lignes non identiques:
L'option -y permet un affichage côte à côte des fichiers. Pour des fichiers courts avec peu de colonnes comme dans notre exemple la sortie est clairement lisible:
$ diff -y essai.txt essai2.txt
Ci dessous la sortie obtenue. On remarque que la ligne modifiée est préfixée par le caractère |
:
DXzs9Oq60ULUMQILNo9XHH8WJWWx7E DXzs9Oq60ULUMQILNo9XHH8WJWWx7E QtR3BldTq6Uy4hIwVRoPJCNQIA1UOd QtR3BldTq6Uy4hIwVRoPJCNQIA1UOd A8ECGIzM72FqPOwEq8gSgFFIoPhbBT A8ECGIzM72FqPOwEq8gSgFFIoPhbBT 6KYnm0FuWSCUsGCM1l7Fy7uLw8nHjE | .. La ligne 4 est modifiée .. fF2myE3iVSHpUZ5hImMFK4mPOVdag2 fF2myE3iVSHpUZ5hImMFK4mPOVdag2 ty0AD2q0GfPjAqK3QR6x7DOzRVIxTo ty0AD2q0GfPjAqK3QR6x7DOzRVIxTo rSoP7edVT8mVxKFydRO74EYNmliEQ0 rSoP7edVT8mVxKFydRO74EYNmliEQ0 4Sr87kZpR2rlup4aSM9yXARXfT6hS4 4Sr87kZpR2rlup4aSM9yXARXfT6hS4
Lorsque les fichiers à comparer deviennent gros ou comportent un grand nombre de caractères par ligne ce type de sortie n'est plus vraiment adaptée.
En général, dans un contexte de développement, ce sont de gros fichiers qui sont légèrement modifiés. Pour mieux représenter ces légères modifications la totalité du fichier n'est pas affichée par diff. Seule la zone ayant subi une altération est affichée avec quelques lignes de contexte (lignes restées inchangées avant et après). Cette zone est appelée chunk ou hunk (qui signifie tronçon ou gros morceau).
Chaque chunk est introduit par une entête encadrée par les caractères “@@” L’entête indique pour chacun des fichiers le numéro de la ligne de départ du tronçon et le nombre de lignes du tronçon.
$ diff -u essai.txt essai2.txt
La sortie produite par diff est la suivante:
--- essai.txt 2018-01-11 18:13:55.639032615 +0100 +++ essai2.txt 2018-01-11 18:13:55.639032615 +0100 @@ -1,7 +1,7 @@ DXzs9Oq60ULUMQILNo9XHH8WJWWx7E QtR3BldTq6Uy4hIwVRoPJCNQIA1UOd A8ECGIzM72FqPOwEq8gSgFFIoPhbBT -6KYnm0FuWSCUsGCM1l7Fy7uLw8nHjE +.. La ligne 4 est modifiée .. fF2myE3iVSHpUZ5hImMFK4mPOVdag2 ty0AD2q0GfPjAqK3QR6x7DOzRVIxTo rSoP7edVT8mVxKFydRO74EYNmliEQ0
Dans l'exemple ci-dessus la sortie commence par désigner les marqueurs associés à chaque fichier:
Le fichier ne comportant qu'une seule modification un seul chunk est affiché, il est introduit par l’entête:
@@ -1,7 +1,7 @@
Le chunk affiche les lignes du contexte et les deux versions de la ligne 4 préfixée avec - pour celle du fichier A et préfixée avec + pour celle du fichier B.