Utilisation des commandes diff et patch sous Linux


Ruban
Cet article a pour but de vous faire comprendre comment fonctionnent les commandes diff et patch sous Linux. Ces commandes sont très utilisées dans le monde des logiciels libres, car elles permettent de patcher le code source d'un programme par exemple.

Afin de bien saisir le fonctionnement de tout ceci, nous allons commencer par créer le fichier version1 contenant les 3 lignes suivantes :

$ cat version1
1
2
4

Mais voilà, nous venons de nous rendre compte qu'il manque une ligne avec le chiffre 3. Nous allons donc créer une nouvelle version de notre fichier, nommé version2, corrigeant l'erreur :

$ cat version2
1
2
3
4

1. La commande diff

La commande diff permet de voir la différence entre deux fichiers. Voici un exemple de fonctionnement :

$ diff version1 version2
2a3
> 3

Ici, la commande nous indique qu'entre la ligne 2 et 3, il y a le chiffre 3 en plus pour le fichier version2, visible grâce au symbole >.

Si vous comparez deux fichiers contenant beaucoup de différence, on pourra utiliser la commande more en plus pour faire défiler le résultat :

diff version1 version2 | more

Cette commande permet également de connaître toutes les divergences entre les fichiers de deux répertoires. Pour cela, il suffit d'utiliser le paramètre -r :

diff -r repertoire1 repertoire1

2. Créer un patch

Imaginons maintenant que le fichier version1 a été distribué à plein de personnes et ces dernières ne veulent pas télécharger la nouvelle version. On pourra alors leurs fournir un patch (c'est à dire un fichier qui contient les différences entre deux versions). A cette fin, on utilisera la commande diff avec les paramètres suivants :

$ diff -u version1 version2 > update1to2.patch
$ cat update1to2.patch
--- version1 2007-08-04 17:15:45.000000000 +0200
+++ version2 2007-08-04 17:18:41.000000000 +0200
@@ -1,3 +1,4 @@
1
2
+3
4

Ici, on a pris le soin de rediriger les différences vers un nouveau fichier, nommé update1to2.patch. On pourra ainsi distribuer ce patch afin que la personne ayant le fichier version1, puisse le mettre à jour en version2.

3. Patcher avec la commande patch

La dernière partie de cet article, concerne l'application d'un patch. Vous aviez le fichier version1 et vous venez de recevoir le patch update1to2.patch.

Pour mette à jour votre fichier, il suffira d'utiliser la commande patch suivante :

patch -p0 < update1to2.patch
patching file version1

L'argument -p{nb} indique de tronquer x répertoires dans les noms de fichiers affectés par le patch. Cela peut-être pratique quand un patch s'applique à une aborescence qui n'est pas la même que la votre.

On vérifiera ensuite que la ligne manquante a bien été ajoutée au fichier version1.


11 Commentaires pour "Utilisation des commandes diff et patch sous Linux"

Flux des commentaires de cet article Ajouter un commentaire
  •  

    Merci pour ces infos précieuses ;)

    RépondreRépondre
    daria , le 3 octobre 2007 à 17:55
  •  

    @Daria : de rien.

    RépondreRépondre
    pti-seb , le 4 octobre 2007 à 08:54
  •  

    Voici la commande que je viens d'obtenir pour générer un patch entre deux dossiers complets:

    diff -Nur dossierOrigine dossierModif > modif.patch

    N : gestion des ajouts de fichiers entre l'origine et la modif
    u : format de sortie ("unified")..
    r : récursif

    RépondreRépondre
    Thannoy , le 12 janvier 2009 à 18:56
  •  

    "L'argument -p0 précise que l'on veut patcher avec un niveau de 0." <= ça ne veut pas dire grand chose !
    -p{nb} indique de tronquer {nb} répertoires dans les noms de fichiers affectés par le patch.
    En clair ici ça ne sert strictement à rien vu que tu ne patches pas une arborescence ;)

    RépondreRépondre
    Hypher , le 21 juillet 2009 à 11:25
  •  

    @Hypher : j'ai ajouté quelques précisions sur l'option -p afin que cela soit plus clair.

    RépondreRépondre
    pti-seb , le 10 septembre 2009 à 12:27
  •  

    Quelqu'un m'a conseillé les options de diff -ruwbB --show-c-function

    Il me semble qu'il faut éditer le fichier patch pour changer le nom du fichier en entrée, si nécessaire.

    Penser à copier le fichier original au cas où. :-)
    cp fichier1 fichier1original

    Pour finir, il faut noter que la commande renvoie le message :
    patching file /chemin/fichier1
    (patching file n'est pas une commande linux, mais un message renvoyé par la commande patch)

    RépondreRépondre
    Pascal Boulerie , le 31 mars 2010 à 16:54
  •  

    Il serait intéressant de parler du logiciel *meld* qui permet de comparer des fichiers (et même des arborescences) très simplement et de manière très efficace tout cela graphiquement, avec de nombreuses possibilités... à tester !

    RépondreRépondre
    yvand , le 21 mai 2013 à 17:11
  •  

    @yvand : Les truc graphics c'est pour les noob.
    Les vrais utilisent le shell

    RépondreRépondre
    TRoll , le 3 octobre 2013 à 23:15
  •  

    Les vrais utilis(ai)ent le shell lorsqu'il n'y avait que ça...
    je conviens que la couche graphique peut apporter sont lot d'incertitude, voire de restriction par dessus les commandes, mais cela peut être utile dans un premier temps...
    meld est un bon outil.
    Ceci dit, si je suis arrivé, sur ce forum, c'est bien que je cherchais les 'commandes' de base pour patcher un fichier...

    RépondreRépondre
    tauvetech , le 14 novembre 2013 à 23:13
  •  

    @Thannoy : Merci!

    RépondreRépondre
    BlaX , le 30 avril 2015 à 14:33
  •  

    Bonjour,

    Mon problème c'est que j'ai un programme (pound) qui est déjà en prod qui nécessite un patch pour corriger les failles de sécurités SSL. J'ai déjà récupéré les fichiers patchs mais je ne sais pas où les appliquer car je ne trouve plus les fichiers .c ou .h comme dans les fichiers sources fraichement télécharger.
    Pouvez-vous m'aider svp car cela fait des jours que je gallère là-dessus alors que c'est urgent ?
    J'ai un serveur de test qui a les mêmes config mais j'ai juste besoin de savoir comment patcher une appli dans cette condition ?

    Merci d'avance pour votre aide.

    RépondreRépondre
    rseb , le 30 avril 2015 à 16:10
 

Ajouter un commentaire

actualité android apache apple astuce astuces bash bilboblog blog boot chrome clavier commande commandes conky date debian Desktop développement elementary exploit faille fedora firefox flash gimp gnome google graphique Graphisme hack hacking Hardware humour intel internet iphone jailbreak Jeux Kde kernel libre Linux log logiciels Logiciels Libres lucid lynx maemo mail maquette metasploit microsoft mobile mockup monitoring mozilla multi-touch musique mysql n900 nautilus nokia noyau openoffice open source password photos php Planet publicité red hat redhat rpm réseau screenshot script serveur serveurs shell sql ssh statistiques sysadmin system Sécurité thème tux-planet tv twitter ubuntu unity vidéo vidéos vlc voyage wallpaper windows wordpress yum