Outils pour utilisateurs

Outils du site


software:applications:diff

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
software:applications:diff [2018/01/11 17:12] – créée yoannsoftware:applications:diff [2022/10/04 13:30] (Version actuelle) yoann
Ligne 3: Ligne 3:
 ====== diff ====== ====== diff ======
  
-La commande **diff** permet d'identifier les différences entre deux fichiers. 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 +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 
  
 ===== Les fichiers exemples ===== ===== Les fichiers exemples =====
Ligne 39: Ligne 39:
 </file> </file>
  
-===== Principaux formatages de la sortie =====+===== Formats de sortie ===== 
 + 
 +Lorsque **diff** est invoqué sans autre argument que les fichiers à comparer, il retourne les modifications à apporter pour passer du premier fichier au second: 
 + 
 +<code bash> 
 +diff essai.txt essai2.txt 
 +</code> 
 +<file> 
 +4c4 
 +< 6KYnm0FuWSCUsGCM1l7Fy7uLw8nHjE 
 +--- 
 +> .. La ligne 4 est modifiée  .. 
 +</file> 
 +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: 
 +  * La ligne 4 du fichier essai.txt doit être modifiée (**c**) en la ligne 4 du fichier essai2.txt; 
 +  * La ligne préfixée par '**<**' est la ligne du premier fichier (essai.txt) impactée par les changements; 
 +  * La ligne préfixée par '**>**' est la ligne du second fichier (esssai2.txt) impactée par le changement 
 + 
 + 
 +3 lettres peuvent être utilisées: 
 +  * **a**((**a**dd)) pour un ajout; 
 +  * **c**((**c**hange)) pour une modification; 
 +  * **d**((**d**elete)) pour une suppression. 
 + 
 +===== Affichage du contexte ===== 
 + 
 +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. 
 + 
 +<code bash> 
 +diff -c essai.txt essai2.txt  
 +</code> 
 +<file> 
 +*** 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 
 +</file> 
 + 
 +Par défaut le contexte affiche 3 lignes précédant la modification et 3 lignes la succédant.  
 + 
 +  * **!** marque une ligne nécessitant une modification; 
 +  * **-** marque une ligne du premier fichier supprimée dans le second; 
 +  * **+** marque une ligne absente dans le premier fichier et ajoutée dans le second.
  
 ==== Affichage côte à côte ==== ==== Affichage côte à côte ====
 +
 +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: 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:
Ligne 48: Ligne 108:
 $ diff -y essai.txt essai2.txt $ diff -y essai.txt essai2.txt
 </code>  </code> 
 +
 +Ci dessous la sortie obtenue. On remarque que la ligne modifiée est préfixée par le caractère ''**|**'':
 +
 +<code>
 +DXzs9Oq60ULUMQILNo9XHH8WJWWx7E                                  DXzs9Oq60ULUMQILNo9XHH8WJWWx7E
 +QtR3BldTq6Uy4hIwVRoPJCNQIA1UOd                                  QtR3BldTq6Uy4hIwVRoPJCNQIA1UOd
 +A8ECGIzM72FqPOwEq8gSgFFIoPhbBT                                  A8ECGIzM72FqPOwEq8gSgFFIoPhbBT
 +6KYnm0FuWSCUsGCM1l7Fy7uLw8nHjE                                | .. La ligne 4 est modifiée  ..
 +fF2myE3iVSHpUZ5hImMFK4mPOVdag2                                  fF2myE3iVSHpUZ5hImMFK4mPOVdag2
 +ty0AD2q0GfPjAqK3QR6x7DOzRVIxTo                                  ty0AD2q0GfPjAqK3QR6x7DOzRVIxTo
 +rSoP7edVT8mVxKFydRO74EYNmliEQ0                                  rSoP7edVT8mVxKFydRO74EYNmliEQ0
 +4Sr87kZpR2rlup4aSM9yXARXfT6hS4                                  4Sr87kZpR2rlup4aSM9yXARXfT6hS4
 +</code>
  
 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. 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.
Ligne 55: Ligne 128:
 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). 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 entete encadrée par les caractères "**@**"+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. 
 + 
 +<code bash> 
 +$ diff -u essai.txt essai2.txt  
 +</code> 
 + 
 +La sortie produite par **diff** est la suivante: 
 + 
 +<code> 
 +--- 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 
 +</code> 
 + 
 +Dans l'exemple ci-dessus la sortie commence par désigner les marqueurs associés à chaque fichier: 
 + 
 +  * Au fichier A, essai.txt le marqueur **-** (minus) est associé. 
 +  * Au fichier B, essai2.txt le marqueur **+** est associé. 
 + 
 +Le fichier ne comportant qu'une seule modification un seul chunk est affiché, il est introduit par l’entête: 
 +<code> 
 +@@ -1,7 +1,7 @@ 
 +</code> 
 + 
 +  * Dans le fichier A la modification impacte les lignes 1 à 7 
 +  * Dans le fichier B la modification impacte également les lignes 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.
 + 
  
 ===== Références ===== ===== Références =====
software/applications/diff.1515690774.txt.gz · Dernière modification : 2021/02/01 21:51 (modification externe)