Jak aplikovat opravu na soubor (a vytvořit opravy) v systému Linux

Příkaz Linux patchumožňuje rychle a bezpečně přenášet změny z jedné sady souborů do jiné sady souborů. Naučte se, jak používat patchjednoduchý způsob.

Příkazy Patch a Diff

Představte si, že máte v počítači textový soubor. Obdržíte upravenou verzi tohoto textového souboru od někoho jiného. Jak rychle přenesete všechny změny z upraveného souboru do původního? To je místo patcha diffvstupte do hry. patcha diffnacházejí se v Linuxu a dalších operačních systémech podobných Unixu, jako je macOS.

diffPříkaz zkoumá dvě různé verze souboru a vyjmenovává rozdíly mezi nimi. Rozdíly lze uložit do souboru s názvem opravný soubor.

patch Příkaz může číst soubor oprav a obsah jako soubor instrukcí. Podle těchto pokynů se změny v upraveném souboru replikují v původním souboru.

Nyní si představte, že se tento proces děje s celým adresářem textových souborů. Vše najednou. To je síla patch.

Někdy nedostanete zaslané upravené soubory. Vše, co dostanete odesláno, je soubor opravy. Proč posílat desítky souborů dokola, když můžete odeslat jeden soubor nebo zveřejnit jeden soubor pro snadné stažení?

Co děláte s opravným souborem, abyste skutečně opravili své soubory? Kromě toho, že je to skoro jazyk, je to také dobrá otázka. Provedeme vás tím v tomto článku.

patchPříkaz se nejčastěji používají lidé, kteří pracují s kódem zdrojových souborů software, ale funguje stejně dobře s jakýmkoliv souborem textových souborů bez ohledu na jejich účel, zdrojový kód, nebo ne.

SOUVISEJÍCÍ: Jak porovnat dva textové soubory v terminálu Linux

Náš příklad scénáře

V tomto scénáři jsme v adresáři s názvem práce, který obsahuje další dva adresáře. Jeden se nazývá pracovní a druhý nejnovější . Pracovní adresář obsahuje sadu souborů zdrojového kódu. Nejnovější adresář obsahuje nejnovější verzi těchto souborů zdrojového kódu, z nichž některé byly upraveny.

Z bezpečnostních důvodů je pracovní adresář kopií aktuální verze textových souborů. Není to jejich jediná kopie.

Nalezení rozdílů mezi dvěma verzemi souboru

diffPříkaz najde rozdíly mezi dvěma soubory. Jeho výchozí akcí je vypsat upravené řádky v okně terminálu.

Jeden soubor se volá slang.c. Porovnáme verzi v pracovním adresáři s verzí v nejnovějším adresáři.

Možnost -u (sjednocený) říká, diffže také seznam některých nezměněných textových řádků z před a za každou ze změněných částí. Tyto řádky se nazývají kontextové řádky. Pomáhají  patch příkazu najít přesně místo, kde je třeba provést změnu v původním souboru.

Poskytujeme názvy souborů, abychom diffvěděli, které soubory mají být porovnány. Nejprve je uveden původní soubor, poté upravený soubor. Toto je příkaz, který vydáváme diff:

diff -u working / slang.c nejnovější / slang.c

diffvytvoří výstupní seznam zobrazující rozdíly mezi soubory. Pokud by byly soubory identické, nebyl by vůbec uveden žádný výstup. Vidět tento typ výstupu z diffpotvrzuje, že existují rozdíly mezi dvěma verzemi souborů a že původní soubor potřebuje opravu.

Vytvoření opravného pole

Chcete-li zachytit tyto rozdíly v souboru opravy, použijte následující příkaz. Je to stejný příkaz jako výše, s výstupem z diffpřesměrování do souboru s názvem slang.patch.

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

Název souboru opravy je libovolný. Můžete to nazvat jak chcete. Dát příponu „.patch“ je dobrý nápad; protože však jasně ukazuje, o jaký typ souboru jde.

Chcete-li  patchjednat podle souboru opravy a upravit pracovní soubor / slang.c, použijte následující příkaz. Možnost -u(unified) umožňuje patch vědět, že soubor opravy obsahuje sjednocené kontextové řádky. Jinými slovy jsme použili volbu -u s diffem, takže použijeme -umožnost s patch.

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

Pokud vše půjde dobře, existuje jediný řádek výstupu, který vám říká, patchže soubor opravujete.

Vytvoření zálohy původního pole

Můžeme dát pokyn patchk vytvoření záložní kopie opravených souborů před jejich změnou pomocí možnosti  -b(zálohování). Volba -i(vstup) sděluje oprávce název souboru opravy, který se má použít:

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

Soubor je opraven jako dříve, bez viditelného rozdílu ve výstupu. Pokud se však podíváte do pracovní složky, uvidíte, že byl vytvořen soubor s názvem slang.c.orig. Datová a časová razítka souborů ukazují, že slang.c.orig je původní soubor a slang.c je nový soubor vytvořený uživatelem patch.

Použití rozdílu s adresáři

Můžeme použít diffk vytvoření souboru opravy, který obsahuje všechny rozdíly mezi soubory ve dvou adresářích. Tento soubor opravy pak můžeme použít k tomu, patchaby se tyto rozdíly aplikovaly na soubory v pracovní složce jediným příkazem.

Možnosti, které použijeme, diffjsou možnost -u(sjednocený kontext), kterou jsme použili dříve, možnost -r(rekurzivní), abychom se diffpodívali do všech podadresářů, a možnost -N(nový soubor).

Tato -Nvolba říká, diff jak zacházet se soubory v posledním adresáři, které nejsou v pracovním adresáři. Vynucuje diffvložit pokyny do souboru opravy, aby se patch vytvořily soubory, které jsou přítomny v posledním adresáři, ale chybí v pracovním adresáři.

Možnosti můžete seskupit tak, aby používaly jeden spojovník ( -).

Všimněte si, že poskytujeme pouze názvy adresářů, neříkáme, abychom diffse dívali na konkrétní soubory:

diff -ruN working / latest /> slang.patch

Nahlédnutí do opravného souboru

Pojďme se rychle podívat na soubor opravy. Podíváme lessse na jeho obsah.

V horní části souboru jsou uvedeny rozdíly mezi dvěma verzemi souboru slang.c.

Při procházení souboru opravy dále vidíme, že pak popisuje změny v jiném souboru s názvem structs.h. Tím se ověří, zda opravný soubor rozhodně obsahuje rozdíly mezi různými verzemi více souborů.

Podívejte se, než skočíte

Oprava velké sbírky souborů může být trochu znervózňující, takže využijeme tuto --dry-run možnost, abychom zkontrolovali, zda je vše v pořádku, než se pustíme do provádění změn.

Tato --dry-runmožnost říká, patchže je třeba dělat vše kromě skutečné úpravy souborů. patchprovede všechny své předletové kontroly souborů a pokud narazí na nějaké problémy, nahlásí je. Ať tak či onak, nebudou upraveny žádné soubory.

Pokud nejsou hlášeny žádné problémy, můžeme příkaz opakovat bez --dry-runmožnosti a s jistotou opravit naše soubory.

Možnost -d(adresář) určuje, na patchkterém adresáři se má pracovat.

Všimněte si, že jsme to pomocí -ivolby (vstup) říci patch, který soubor náplast obsahuje pokyny diff. Místo toho přesměrováváme soubor opravy na patchpomocí <.

patch --dry-run -ruN -d pracuje <slang.patch

Z celého adresáře byly diffnalezeny dva soubory k opravě. Pokyny týkající se úprav těchto dvou souborů byly zkontrolovány patch a nebyly hlášeny žádné problémy.

Předletové kontroly jsou v pořádku; jsme připraveni na vzlet.

Oprava adresáře

K opravnému použití oprav na soubory používáme předchozí příkaz bez --dry-runmožnosti.

patch -ruN -d pracuje <slang.patch

Tentokrát každý řádek výstupu nezačíná „kontrolou“, každý řádek začíná „opravou“.

A nejsou hlášeny žádné problémy. Můžeme sestavit náš zdrojový kód a budeme na nejnovější verzi softwaru.

Vyrovnejte své rozdíly

Toto je zdaleka nejjednodušší a nejbezpečnější způsob použití patch. Zkopírujte své cílové soubory do složky a opravte tuto složku. Zkopírujte je zpět, až budete rádi, že proces opravy byl dokončen bez chyb.