Comment appliquer un correctif à un fichier (et créer des correctifs) sous Linux

La commande de correctif Linux vous permet de transférer les modifications d’un ensemble de fichiers vers un autre ensemble de fichiers rapidement et en toute sécurité. Apprenez à utiliser patch de manière simple.

Les commandes patch et diff

Imaginez que vous avez un fichier texte sur votre ordinateur. Vous recevez une version modifiée de ce fichier texte de quelqu’un d’autre. Comment transférer rapidement toutes les modifications du fichier modifié vers votre fichier d’origine? C’est là que patch et diff entrent en jeu. patch et diff se trouvent dans Linux et d’autres systèmes d’exploitation de type Unix, tels que macOS.

La commande diff examine deux versions différentes d’un fichier et énumère les différences entre eux. Les différences peuvent être stockées dans un fichier appelé fichier patch.

La commande patch peut lire un fichier de patch et utiliser le contenu comme un ensemble d’instructions. En suivant ces instructions, les modifications du fichier modifié sont répliqué dans l’original fichier.

Imaginez maintenant que ce processus se produise dans un répertoire entier de fichiers texte. Tout en une seule fois. C’est la puissance du patch.

Parfois, vous ne recevez pas les fichiers modifiés. Tout ce que vous recevez est le fichier de correctif. Pourquoi envoyer des dizaines de fichiers lorsque vous pouvez envoyer un fichier ou publier un fichier pour un téléchargement facile?

Que faites-vous avec le fichier de correctif pour corriger vos fichiers? En plus d’être presque un virelangue, c’est aussi une bonne question. Nous vous expliquerons cela dans cet article.

La commande patch est le plus souvent utilisée par les personnes travaillant avec des fichiers de code source de logiciels, mais elle fonctionne aussi bien avec n’importe quel ensemble de fichiers texte quel que soit leur objectif, code source ou non.

Notre exemple de scénario

Dans ce scénario, nous sommes dans un répertoire appelé work qui contient deux autres répertoires. L’un s’appelle le travail et l’autre s’appelle le dernier. Le répertoire de travail contient un ensemble de fichiers de code source. Le dernier répertoire contient la version la plus récente de ces fichiers de code source, dont certains ont été modifiés.

  Comment améliorer les performances graphiques de Minecraft sous Linux

Pour être sûr, le répertoire de travail est une copie de la version actuelle des fichiers texte. Ce n’est pas la seule copie d’entre eux.

Recherche des différences entre deux versions d’un fichier

La commande diff trouve les différences entre deux fichiers. Son action par défaut est de lister les lignes modifiées dans la fenêtre du terminal.

Un fichier s’appelle slang.c. Nous comparerons la version du répertoire de travail à celle du dernier répertoire.

L’option -u (unifiée) indique à diff de lister également certaines des lignes de texte non modifiées avant et après chacune des sections modifiées. Ces lignes sont appelées lignes de contexte. Ils aident la commande patch à localiser précisément où une modification doit être apportée dans le fichier d’origine.

Nous fournissons les noms des fichiers afin que diff sache quels fichiers comparer. Le fichier d’origine est répertorié en premier, puis le fichier modifié. C’est la commande que nous émettons pour diff:

diff -u working/slang.c latest/slang.c

diff -u working / slang.s latest / slang.c dans une fenêtre de terminal

diff produit une liste de sortie montrant les différences entre les fichiers. Si les fichiers étaient identiques, aucune sortie ne serait répertoriée. Voir ce type de sortie de diff confirme qu’il existe des différences entre les deux versions de fichier et que le fichier d’origine doit être corrigé.

sortie de diff dans une fenêtre de terminal

Créer un fichier de correctifs

Pour capturer ces différences dans un fichier de correctif, utilisez la commande suivante. C’est la même commande que ci-dessus, avec la sortie de diff redirigée vers un fichier appelé slang.patch.

diff -u working/slang.c latest/slang.c > slang.patch

diff -u working / slang.c latest / slang.c> slang.patch dans une fenêtre de terminal ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ” onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p><p> Le nom du fichier de correctif est arbitraire. Vous pouvez l’appeler comme vous le souhaitez. Lui donner une extension «.patch» est une bonne idée; cependant, car il indique clairement de quel type de fichier il s’agit. </p><p> Pour que patch agisse sur le fichier patch et modifie le fichier de travail / slang.c, utilisez la commande suivante. L’option -u (unifiée) permet à patch de savoir que le fichier de patch contient des lignes de contexte unifiées. En d’autres termes, nous avons utilisé l’option -u avec diff, donc nous utilisons l’option -u avec patch. </p><div style=

patch -u working.slang.c -i slang.patch

Si tout se passe bien, il y a une seule ligne de sortie indiquant que le correctif corrige le fichier.

Faire une sauvegarde du fichier d’origine

Nous pouvons demander à patch de faire une copie de sauvegarde des fichiers patchés avant qu’ils ne soient modifiés en utilisant l’option -b (sauvegarde). L’option -i (entrée) indique à patch le nom du fichier de patch à utiliser:

patch -u -b working.slang.c -i slang.patch

patch -u working.slang.c -i slang.patch dans une fenêtre de terminal

Le fichier est patché comme précédemment, sans différence visible dans la sortie. Cependant, si vous regardez dans le dossier de travail, vous verrez que le fichier appelé slang.c.orig a été créé. La date et l’heure des fichiers indiquent que slang.c.orig est le fichier d’origine et slang.c est un nouveau fichier créé par patch.

sortie de ls dans une fenêtre de terminal

Utilisation de diff avec des répertoires

Nous pouvons utiliser diff pour créer un fichier de correctif contenant toutes les différences entre les fichiers dans deux répertoires. Nous pouvons ensuite utiliser ce fichier de patch avec patch pour appliquer ces différences aux fichiers du dossier de travail avec une seule commande.

Les options que nous allons utiliser avec diff sont l’option -u (contexte unifié) que nous avons utilisée précédemment, l’option -r (récursive) pour que diff regarde dans tous les sous-répertoires et l’option -N (nouveau fichier).

L’option -N indique à diff comment gérer les fichiers du dernier répertoire qui ne se trouvent pas dans le répertoire de travail. Cela force diff à mettre des instructions dans le fichier de correctif afin que patch crée des fichiers qui sont présents dans le dernier répertoire mais absents du répertoire de travail.

Vous pouvez regrouper les options afin qu’elles utilisent un seul trait d’union (-).

Notez que nous ne fournissons que les noms de répertoires, nous ne disons pas à diff de regarder des fichiers spécifiques:

diff -ruN working/ latest/ > slang.patch

diff -ruN working / latest /> slang.patch ”width =” 646 ″ height = ”77 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ” onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p><div style=

Jetant un œil à l’intérieur du fichier de correctif

Jetons un coup d’œil dans le fichier du correctif. Nous en utiliserons moins pour regarder son contenu.

moins d'argot.patch dans une fenêtre de terminal

Le haut du fichier montre les différences entre les deux versions de slang.c.

moins d'argot.patch montrant le haut de l'ile dans une fenêtre de terminal

En faisant défiler plus bas le fichier du correctif, nous voyons qu’il décrit ensuite les modifications dans un autre fichier appelé structs.h. Cela vérifie que le fichier de correctif contient définitivement les différences entre les différentes versions de plusieurs fichiers.

less slang.patch montrant le milieu du fichier dans une fenêtre de terminal

Réfléchir avant d’agir

Corriger une grande collection de fichiers peut être un peu déconcertant, nous allons donc utiliser l’option –dry-run pour vérifier que tout va bien avant de sauter le pas et de nous engager à faire les changements.

L’option –dry-run indique à patch de tout faire sauf de modifier réellement les fichiers. patch effectuera toutes ses vérifications avant vol sur les fichiers et s’il rencontre des problèmes, il les signale. Dans tous les cas, aucun fichier n’est modifié.

Si aucun problème n’est signalé, nous pouvons répéter la commande sans l’option –dry-run et corriger nos fichiers en toute confiance.

L’option -d (répertoire) indique à patch sur quel répertoire travailler.

Notez que nous n’utilisons pas l’option -i (entrée) pour indiquer à patch quel fichier de patch contient les instructions de diff. Au lieu de cela, nous redirigeons le fichier de patch vers patch avec <. wp_automatic_readability="17.5">

patch --dry-run -ruN -d working 

patch --dry-run -ruN -d working <slang.patch dans une fenêtre de terminal

Out of the entire directory, diff found two files to patch. The instructions regarding the modifications for those two files have been checked by patch , and no problems have been reported.

Pre-flight checks are OK; we’re ready for take-off.

Patching a Directory

To genuinely apply the patches to the files we use the previous command without the --dry-run option.

patch -ruN -d working 

patch -ruN -d fonctionne <slang.patch dans une fenêtre de terminal

Cette fois, chaque ligne de sortie ne commence pas par «vérification», chaque ligne commence par «correction».

Et aucun problème n'est signalé. Nous pouvons compiler notre code source et nous utiliserons la dernière version du logiciel.

Réglez vos différences

C'est de loin le moyen le plus simple et le plus sûr d'utiliser patch. Copiez vos fichiers cibles dans un dossier et corrigez ce dossier. Recopiez-les lorsque vous êtes satisfait que le processus de mise à jour s'est terminé sans erreur.