2021-12-17 14:16 Doba čtení: 10 min
Linux +1

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

Příkaz `patch` v Linuxu umožňuje efektivně a bezpečně aplikovat změny z jedné sady souborů na jinou. Objevte jednoduchý způsob, jak ho používat.

Nástroje `patch` a `diff`

Představte si situaci, kdy máte textový dokument ve vašem počítači. Od jiného uživatele získáte jeho upravenou verzi. Jak rychle a jednoduše přenesete všechny úpravy do vašeho originálního souboru? Právě zde se uplatní příkazy `patch` a `diff`. Tyto nástroje jsou běžné v Linuxu a dalších Unixových systémech, jako je macOS.

Příkaz `diff` analyzuje dvě odlišné verze souboru a identifikuje rozdíly mezi nimi. Tyto rozdíly se poté dají uložit do speciálního souboru, který se nazývá patch soubor.

Příkaz `patch` umí číst tento patch soubor a interpretovat jeho obsah jako sadu instrukcí. Na základě těchto instrukcí jsou změny z upraveného souboru aplikovány do původního souboru.

Nyní si představte, že tento proces aplikujete na celou složku plnou textových souborů, a to jedním příkazem. To ukazuje sílu příkazu `patch`.

Někdy nedostáváte upravené soubory samotné, ale pouze patch soubor. Proč posílat desítky souborů, když můžete odeslat jediný, a zjednodušit tak stahování?

Jak ale použít patch soubor k opravě vašich souborů? I když to může znít složitě, je to celkem jednoduché. V tomto článku vás provedeme celým procesem.

Příkaz `patch` je často využíván při práci se zdrojovými kódy softwaru, ale funguje bez problémů s jakoukoli sadou textových dokumentů, ať už se jedná o zdrojový kód, nebo ne.

Příklad použití

V tomto příkladu budeme pracovat v adresáři s názvem `work`, který obsahuje dvě podsložky: `working` a `latest`. V adresáři `working` se nachází sada zdrojových kódů. V adresáři `latest` jsou aktuální verze těchto souborů, z nichž některé byly upraveny.

Adresář `working` je kopií stávajících textových souborů, ale není jejich jedinou kopií.

Zjišťování rozdílů mezi dvěma verzemi souborů

Příkaz `diff` slouží k nalezení rozdílů mezi dvěma soubory. Ve výchozím nastavení zobrazí v terminálu seznam řádků, které se liší.

Jeden ze souborů se nazývá `slang.c`. Porovnáme jeho verzi v adresáři `working` s verzí v adresáři `latest`.

Volba `-u` (unified) způsobí, že `diff` vypíše také několik nemodifikovaných řádků před a za každou změnou. Tyto řádky se nazývají kontextové řádky a pomáhají příkazu `patch` přesně určit, kde má změny v původním souboru aplikovat.

Jako argumenty uvádíme názvy souborů, aby `diff` věděl, které soubory má porovnat. Nejdříve se uvádí originální soubor, poté upravený. Příkaz pro porovnání vypadá takto:

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

Výstup z `diff` zobrazí rozdíly mezi soubory. Pokud by byly soubory identické, žádný výstup by se nezobrazil. Zobrazení tohoto typu výstupu potvrzuje, že mezi verzemi souborů jsou rozdíly a že původní soubor vyžaduje opravu.

Vytvoření patch souboru

Pro uložení rozdílů do patch souboru použijeme následující příkaz. Je to stejný příkaz jako předtím, jenomže výstup z `diff` přesměrujeme do souboru pojmenovaného `slang.patch`.

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

K aplikování změn z patch souboru na soubor `working/slang.c` použijeme následující příkaz. Volba `-u` (unified) říká, že patch soubor obsahuje unifikované kontextové řádky. Jinými slovy, když jsme použili `-u` s `diff`, použijeme ji i s `patch`.

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

Pokud vše proběhne bez problémů, vypíše se jeden řádek, který potvrdí, že `patch` soubor upravil.

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

Použitím volby `-b` (backup) zajistíme, že `patch` vytvoří zálohu modifikovaných souborů před jejich změnou. Volba `-i` (input) sdělí `patch`, který patch soubor se má použít:

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

Soubor je opraven jako předtím, bez viditelné změny výstupu. Když se podíváte do adresáře `working`, uvidíte, že byl vytvořen soubor s názvem `slang.c.orig`. Datum a časová razítka ukazují, že `slang.c.orig` je původní soubor, a `slang.c` je nový soubor vytvořený `patch`.

Použití `diff` s adresáři

Můžeme použít `diff` k vytvoření patch souboru, který obsahuje veškeré rozdíly mezi soubory ve dvou adresářích. Poté tento patch soubor můžeme použít s `patch` k aplikaci všech změn v adresáři `working` jedním příkazem.

Volby, které použijeme s `diff`, jsou `-u` (unifikovaný kontext), kterou jsme používali již dříve, `-r` (rekurzivní), aby se `diff` podíval do všech podsložek a `-N` (nový soubor).

Volba `-N` říká `diff`, jak má zacházet se soubory v adresáři `latest`, které v adresáři `working` neexistují. Přinutí `diff` vložit do patch souboru instrukce tak, aby `patch` vytvořil soubory, které jsou v adresáři `latest`, ale chybí v `working`.

Volby lze seskupit tak, že se použije jeden spojovník (-).

Všimněte si, že zadáváme pouze názvy adresářů, neříkáme `diff`, aby se díval na konkrétní soubory:

diff -ruN working/ latest/ > slang.patch

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

Při posouvání v patch souboru dále dolů zjistíme, že popisuje změny v dalším souboru, s názvem `structs.h`. Tím ověříme, že patch soubor skutečně obsahuje rozdíly mezi více verzemi několika souborů.

Nejdříve se podívej, pak skoč

Aplikace patch souboru na velkou sadu souborů může být trochu riskantní, takže použijeme volbu `--dry-run`, abychom zkontrolovali, jestli je vše v pořádku předtím, než začneme a provedeme změny.

Volba `--dry-run` říká `patch`, aby provedl všechny operace kromě samotné modifikace souborů. `patch` provede všechny předběžné kontroly souborů a pokud narazí na nějaké problémy, ohlásí je. V obou případech se žádné soubory nezmění.

Pokud nejsou ohlášeny žádné problémy, můžeme příkaz zopakovat bez volby `--dry-run` a s jistotou aplikovat změny na naše soubory.

Volba `-d` (directory) říká `patch`, ve kterém adresáři má pracovat.

Všimněte si, že nepoužíváme volbu `-i` (input) k tomu, abychom sdělili `patch`, který soubor opravy obsahuje instrukce z `diff`. Místo toho přesměrujeme patch soubor do `patch` pomocí `<`.

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

Z celého adresáře našel `diff` dva soubory, které je potřeba patchovat. Instrukce ohledně modifikací těchto dvou souborů byly zkontrolovány příkazem `patch` a nebyly ohlášeny žádné problémy.

Předběžné kontroly jsou v pořádku, jsme připraveni.

Aplikace patche na adresář

Pro skutečné aplikování patchů na soubory použijeme předchozí příkaz bez volby `--dry-run`.

patch -ruN -d working < slang.patch

Tentokrát každý řádek výstupu nezačíná "checking", ale "patching".

A nebyly nahlášeny žádné problémy. Můžeme zkompilovat zdrojový kód a budeme mít aktuální verzi softwaru.

Vyřešte vaše rozdíly

Toto je zdaleka nejjednodušší a nejbezpečnější způsob, jak používat `patch`. Zkopírujte vaše cílové soubory do složky a aplikujte patch na tuto složku. Jakmile budete mít jistotu, že proces patchování proběhl bez chyb, zkopírujte je zpět.

Jan Novák
Autor
Czechia

Redaktor zaměřený na Windows, produktivitu a cloudové nástroje.

Předchozí článek
Jak vytvořit hypertextový odkaz Mailto v PowerPointu
Další článek
Jak používat režim skryté čtečky Google Chrome