Jak aplikovat opravu na soubor (a vytvářet opravy) v Linuxu

Příkaz Linux patch umožňuje rychle a bezpečně přenést změny z jedné sady souborů do jiné sady souborů. Naučte se používat patch jednoduchým způsobem.

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 souboru? Zde vstupuje do hry patch a diff. patch a diff se nacházejí v Linuxu a dalších unixových operačních systémech, jako je macOS.

Příkaz diff zkoumá dvě různé verze souboru a uvádí rozdíly mezi nimi. Rozdíly mohou být uloženy v souboru zvaném záplatový soubor.

Příkaz patch může číst soubor opravy a používat obsah jako sadu instrukcí. Podle těchto pokynů se změny v upraveném souboru projeví replikována v originále soubor.

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

Někdy nedostanete upravené soubory. Vše, co dostanete, je soubor opravy. Proč posílat desítky souborů, když můžete poslat jeden soubor nebo poslat jeden soubor pro snadné stažení?

Co uděláte s opravným souborem, abyste skutečně opravili své soubory? Kromě toho, že je to skoro jazykolam, je to také dobrá otázka. V tomto článku vás provedeme.

Příkaz patch je nejčastěji používán lidmi, kteří pracují se soubory zdrojového kódu softwaru, ale funguje stejně dobře s jakoukoli sadou textových souborů bez ohledu na jejich účel, zdrojový kód nebo ne.

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

V tomto scénáři se nacházíme v adresáři s názvem work, který obsahuje dva další 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.

  Jak nainstalovat rozšíření Google Chrome v Microsoft Edge

Pro jistotu je pracovní adresář kopií aktuální verze textových souborů. Není to jejich jediná kopie.

Hledání rozdílů mezi dvěma verzemi souboru

Příkaz diff najde rozdíly mezi dvěma soubory. Jeho výchozí akcí je zobrazit seznam upravených řádků v okně terminálu.

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

Volba -u (unified) říká diffu, aby také vypsal některé neupravené textové řádky před a za každou ze změněných částí. Tyto řádky se nazývají kontextové řádky. Pomáhají příkazu patch přesně lokalizovat, kde je třeba provést změnu v původním souboru.

Poskytujeme názvy souborů, aby diff věděl, které soubory porovnat. Nejprve je uveden původní soubor, poté upravený soubor. Toto je příkaz, který vydáváme k porovnání:

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

diff vytváří výstupní výpis ukazující rozdíly mezi soubory. Pokud by byly soubory totožné, nebyl by uveden vůbec žádný výstup. Zobrazení tohoto typu výstupu z diff potvrzuje, že mezi dvěma verzemi souborů jsou rozdíly a že původní soubor potřebuje opravu.

Vytvoření opravného souboru

Chcete-li zachytit tyto rozdíly v souboru opravy, použijte následující příkaz. Je to stejný příkaz jako výše, přičemž výstup z diff je přesměrován do souboru nazvaného slang.patch.

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

diff -u working/slang.c nejnovější/slang.c > slang.patch v okně terminálu” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Název souboru opravy je libovolný.  Můžete tomu říkat, jak chcete.  Dát tomu příponu „.patch“ je dobrý nápad;  nicméně, protože je jasné, o jaký typ souboru se jedná.</p>
<p>Chcete-li, aby záplata působila na záplatový soubor a upravila soubor working/slang.c, použijte následující příkaz.  Volba -u (sjednocené) informuje o tom, že soubor opravy obsahuje jednotné kontextové řádky.  Jinými slovy, použili jsme volbu -u s diff, takže použijeme volbu -u s patchem.</p>
<div style=

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

Pokud vše půjde dobře, je tu jeden řádek výstupu, který vám řekne, že patch opravuje soubor.

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

Pomocí volby -b (záloha) můžeme dát patchi vytvořit záložní kopii opravených souborů před jejich změnou. Volba -i (vstup) sděluje patchi 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. Datum a časová razítka souborů ukazují, že slang.c.orig je původní soubor a slang.c je nový soubor vytvořený patchem.

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

Můžeme použít diff k vytvoření záplatového souboru, který obsahuje všechny rozdíly mezi soubory ve dvou adresářích. Pak můžeme použít tento opravný soubor s opravou, abychom tyto rozdíly aplikovali na soubory v pracovní složce jediným příkazem.

Volby, které budeme používat s diff, jsou volba -u (sjednocený kontext), kterou jsme použili dříve, volba -r (rekurzivní), aby se diff podíval do jakýchkoli podadresářů, a volba -N (nový soubor).

Volba -N říká diff, jak zacházet se soubory v nejnovějším adresáři, které nejsou v pracovním adresáři. Přinutí diff vložit instrukce do souboru opravy, takže patch vytvoří soubory, které jsou přítomny v nejnovějším adresáři, ale chybí v pracovním adresáři.

Možnosti můžete seskupit tak, že budou používat jeden spojovník (-).

Všimněte si, že poskytujeme pouze názvy adresářů, neříkáme diffu, aby se podíval na konkrétní soubory:

diff -ruN working/ latest/ > slang.patch

diff -ruN pracovní/ nejnovější/ > slang.patch” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<h2 role=Nahlédnutí do souboru opravy

Pojďme se rychle podívat do souboru opravy. K prohlížení jeho obsahu použijeme méně.

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

  Jak získat režim Portrét na nepodporovaném iPhone

Posouváme-li se v záplatovém souboru dále dolů, vidíme, že pak popisuje změny v jiném souboru s názvem structs.h. Tím se ověří, že soubor opravy rozhodně obsahuje rozdíly mezi různými verzemi více souborů.

Podívejte se, než skočíte

Záplatování velké sbírky souborů může být trochu znervózňující, takže použijeme možnost –dry-run, abychom zkontrolovali, zda je vše v pořádku, než se do toho pustíme a zavážeme se k provedení změn.

Možnost –dry-run říká patchi, aby udělal vše kromě skutečné úpravy souborů. patch provede všechny své předletové kontroly souborů a pokud narazí na nějaké problémy, nahlásí je. V obou případech se žádné soubory nezmění.

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

Volba -d (adresář) říká patchi, na kterém adresáři má pracovat.

Všimněte si, že nepoužíváme volbu -i (vstup) k tomu, abychom sdělili patchi, který soubor opravy obsahuje instrukce z diff. Místo toho přesměrováváme záplatový soubor do záplaty s <. wp_automatic_readability="17.5">

patch --dry-run -ruN -d working 

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 

This time each line of output doesn’t start with “checking,” each line starts with “patching.”

And no problems are reported. We can compile our source code, and we’ll be on the latest version of the software.

Settle Your Differences

This is by far the easiest and safest way to use patch. Copy your target files to a folder and patch that folder. Copy them back when you’re happy that the patching process completed error free.