Jak porovnat dva textové soubory v terminálu Linux

Potřebujete vidět rozdíly mezi dvěma revizemi textového souboru? Pak je diff příkaz, který potřebujete. Tento tutoriál vám ukáže, jak používat rozdíl v Linuxu a macOS jednoduchým způsobem.

Potápění do rozdílu

Příkaz diff porovná dva soubory a vytvoří seznam rozdílů mezi nimi. Aby to bylo přesnější, vytvoří seznam změn, které by bylo třeba provést v prvním souboru, aby odpovídal druhému souboru. Pokud to budete mít na paměti, snáze pochopíte výstup z diff. Příkaz diff byl navržen tak, aby našel rozdíly mezi soubory zdrojového kódu a vytvořil výstup, který lze číst a pracovat s ním jinými programy, jako je např. náplast příkaz. V tomto tutoriálu se podíváme na nejužitečnější způsoby použití diff, které jsou pro člověka přátelské.

Pojďme se ponořit a analyzovat dva soubory. Pořadí souborů na příkazovém řádku určuje, který souborový rozdíl je považován za „první soubor“ a který za „druhý soubor“. V níže uvedeném příkladu je alpha1 první soubor a alpha2 je druhý soubor. Oba soubory obsahují fonetická abeceda ale druhý soubor, alpha2, prošel dalšími úpravami, takže oba soubory nejsou totožné.

Pomocí tohoto příkazu můžeme porovnat soubory. Zadejte diff, mezeru, název prvního souboru, mezeru, název druhého souboru a stiskněte Enter.

diff alpha1 alpha2

Jak ten výstup rozebereme? Jakmile víte, co hledat, není to tak špatné. Každý rozdíl je uveden postupně v jednom sloupci a každý rozdíl je označen. Štítek obsahuje čísla na obou stranách písmena, například 4c4. První číslo je číslo řádku v alpha1 a druhé číslo je číslo řádku v alpha2. Písmeno uprostřed může být:

c: Řádek v prvním souboru je třeba změnit, aby odpovídal řádku v druhém souboru.
d: Řádek v prvním souboru musí být odstraněn, aby odpovídal druhému souboru.
a: Do prvního souboru je nutné přidat další obsah, aby odpovídal druhému souboru.

4c4 v našem příkladu nám říká, že řádek čtyři alfa1 musí být změněn tak, aby odpovídal řádku čtyři alfa2. Toto je první rozdíl mezi dvěma nalezenými soubory.

Řádky začínající na odkazují na druhý soubor, alpha2. Řádek Dave nám říká, že slovo Dave je obsahem čtvrtého řádku v alfa2. Abychom to shrnuli, musíme nahradit Delta za Dave na řádku čtyři v alpha1, aby se tento řádek shodoval v obou souborech.

Další změna je označena 12c12. Při použití stejné logiky nám to říká, že řádek 12 v alpha1 obsahuje slovo Lima, ale řádek 12 v alpha2 obsahuje slovo Linux.

Třetí změna se týká řádku, který byl odstraněn z alpha2. Štítek 21d20 je dešifrován jako „řádek 21 je třeba odstranit z prvního souboru, aby se oba soubory synchronizovaly od řádku 20 dále“. The

Čtvrtý rozdíl je označen 26a26,28. Tato změna se týká tří dalších řádků, které byly přidány do alpha2. Všimněte si 26,28 na štítku. Dvouřádková čísla oddělená čárkou představují rozsah čísel řádků. V tomto příkladu je rozsah od řádku 26 do řádku 28. Popisek je interpretován jako „na řádku 26 v prvním souboru přidejte řádky 26 až 28 z druhého souboru.“ Jsou nám ukázány tři řádky v alpha2, které je třeba přidat k alpha1. Ty obsahují slova Quirk, Strange a Charm.

Snappy One-Liners

Pokud chcete vědět pouze to, zda jsou dva soubory stejné, použijte volbu -s (nahlásit stejné soubory).

diff -s alpha1 alpha3

Můžete použít volbu -q (krátká), abyste získali stejně stručné prohlášení o dvou různých souborech.

diff -q alpha1 alpha2

Jedna věc, na kterou je třeba dávat pozor, je, že u dvou stejných souborů volba-q (krátká) úplně sedne a nehlásí vůbec nic.

Alternativní pohled

Volba -y (vedle sebe) používá k popisu rozdílů mezi soubory jiné rozložení. Často je vhodné použít volbu -W (šířka) při pohledu vedle sebe, abyste omezili počet zobrazených sloupců. Vyhnete se tak ošklivým zalomeným řádkům, které znesnadňují čtení výstupu. Zde jsme řekli diffu, aby vytvořil zobrazení vedle sebe a omezil výstup na 70 sloupců.

diff -y -W 70 alpha1 alpha2

První soubor na příkazovém řádku, alpha1, je zobrazen vlevo a druhý řádek na příkazovém řádku, alpha2, je zobrazen vpravo. Řádky z každého souboru se zobrazí vedle sebe. Vedle řádků v alpha2 jsou indikační znaky, které byly změněny, odstraněny nebo přidány.

|: Řádek, který byl změněn ve druhém souboru.
<: a="" line="" that="" has="" been="" deleted="" from="" the="" second="" file.="">: Řádek, který byl přidán do druhého souboru, který není v prvním souboru.

Pokud dáváte přednost kompaktnějšímu souhrnu rozdílů mezi soubory, použijte volbu –suppress-common-lines. To nutí diff vypisovat pouze změněné, přidané nebo odstraněné řádky.

diff -y -W 70 --suppress-common-lines alpha1 alpha2

Přidejte šplouchnutí barvy

Další nástroj s názvem colordiff přidává barevné zvýraznění do výstupu rozdílu. Díky tomu je mnohem snazší vidět, které řádky mají rozdíly.

Pokud používáte Ubuntu nebo jinou distribuci založenou na Debianu, použijte apt-get k instalaci tohoto balíčku do vašeho systému. V jiných distribucích Linuxu použijte místo toho nástroj pro správu balíčků vaší distribuce Linuxu.

sudo apt-get install colordiff

Použijte colordiff stejně jako byste použili diff.

Colordiff je ve skutečnosti obal pro diff a diff dělá veškerou práci v zákulisí. Díky tomu budou všechny možnosti rozdílu fungovat s barevným rozdílem.

Poskytování určitého kontextu

Abychom našli nějakou střední cestu mezi zobrazením všech řádků v souborech na obrazovce a zobrazením pouze změněných řádků, můžeme požádat diff o poskytnutí určitého kontextu. Toho lze dosáhnout dvěma způsoby. Oba způsoby dosahují stejného účelu, kterým je zobrazení některých řádků před a po každé změněné řádce. Budete moci vidět, co se děje v souboru v místě, kde byl zjištěn rozdíl.

První metoda používá volbu -c (zkopírovaný kontext).

colordiff -c alpha1 alpha2

Výstup rozdílu má hlavičku. V záhlaví jsou uvedeny dva názvy souborů a časy jejich úprav. Jsou tam hvězdičky

před názvem prvního souboru a pomlčky (-) před názvem druhého souboru. Hvězdičky a pomlčky budou použity k označení souboru, kterému řádky ve výstupu patří.

Čára hvězdiček s 1,7 uprostřed znamená, že se díváme na řádky z alpha1. Abychom byli přesní, díváme se na řádky jedna až sedm. Slovo Delta je označeno jako změněné. Vedle něj je vykřičník ( ! ) a je červený. Před a za tímto řádkem jsou zobrazeny tři řádky nezměněného textu, takže můžeme vidět kontext tohoto řádku v souboru.

Čára pomlček s 1,7 uprostřed nám říká, že se nyní díváme na čáry z alfa2. Znovu se díváme na řádky jedna až sedm, přičemž slovo Dave na řádku čtyři je označeno jako odlišné.

colordiff -C 2 alpha1 alpha2

Tři řádky kontextu nad a pod každou změnou jsou výchozí hodnotou. Můžete určit, kolik řádků kontextu má rozdíl poskytnout. Chcete-li to provést, použijte volbu -C (zkopírovaný kontext) s velkým „C“ a zadejte požadovaný počet řádků:

colordiff -u alpha1 alpha2

Druhá možnost rozdílu, která nabízí kontext, je možnost -u (sjednocený kontext).

Stejně jako předtím máme na výstupu hlavičku. Dva soubory jsou pojmenovány a jsou zobrazeny časy jejich úprav. Před názvem alfa1 jsou pomlčky (-) a před názvem alfa2 znaménka plus (+). To nám říká, že pomlčky budou použity pro odkaz na alfa1 a znaménka plus pro odkaz na alfa2. V celém výpisu jsou roztroušeny řádky začínající zavináčem (@). Tyto řádky označují začátek každého rozdílu. Také nám říkají, které řádky jsou zobrazeny z každého souboru.

Zobrazí se nám tři řádky před a za řádkem označeným jako odlišné, abychom viděli kontext změněného řádku. V jednotném zobrazení jsou čáry s rozdílem zobrazeny nad sebou. Před řádkem z alpha1 je pomlčka a před řádkem z alpha2 je znaménko plus. Tento displej dosahuje v osmi řádcích toho, co zkopírovaný kontextový displej výše potřeboval patnáct.

colordiff -U 2 alpha1 alpha2

Jak byste očekávali, můžeme požádat diff, aby poskytl přesně takový počet řádků jednotného kontextu, jaký bychom chtěli vidět. Chcete-li to provést, použijte volbu -U (sjednocený kontext) s velkým „U“ a zadejte požadovaný počet řádků:

Ignorování prázdného místa a případu

colordiff -y -W 70 test4 test5

Pojďme analyzovat další dva soubory, test4 a test5. Ty mají v sobě jména šesti superhrdinů.

Výsledky ukazují, že diff nenachází nic jiného než linie Black Widow, Spider-Man a Thor. Naznačuje změny s liniemi Captain America, Ironman a The Hulk.

V čem je to tedy jiné? V testu 5 se Hulk píše s malým písmenem „h“ a Captain America má mezi „Captain“ a „America“ mezeru navíc. Dobře, to je jasně vidět, ale co je špatného na řadě Ironmana? Nejsou zde žádné viditelné rozdíly. Zde je dobré pravidlo. Pokud to nevidíte, odpovědí je prázdné místo. Na konci tohoto řádku je téměř jistě jedna nebo dvě mezery nebo znak tabulátoru.

Pokud vám na nich nezáleží, můžete dát diff pokyn, aby ignoroval konkrétní typy rozdílů řádků, včetně:
-i: Ignorovat rozdíly v malých a velkých písmenech.
-Z: Ignorovat bílé místo na konci.
-b: Ignorovat změny v množství prázdného místa.

-w: Ignorovat všechny změny mezer.

colordiff -i -y -W 70 test4 test5

Požádejme diff, aby znovu zkontroloval tyto dva soubory, ale tentokrát ignorujte případné rozdíly.

colordiff -i -Z -y -W 70 test4 test5

Řádky s „The Hulk“ a „The Hulk“ jsou nyní považovány za shodu a u malých písmen „h“ není označen žádný rozdíl. Požádejme diff, aby také ignoroval koncové bílé místo.

colordiff -i -w -y -W 70 test4 test5

Jak bylo podezření, koncové bílé místo muselo být rozdílem na lince Ironmana, protože rozdíl již neoznačuje rozdíl pro tuto linii. Zbývá Captain America. Požádejme diff, aby ignoroval malá a velká písmena a ignoroval všechny problémy s mezerami.

Když řekneme diff, aby ignoroval rozdíly, které nás nezajímají, diff nám řekne, že pro naše účely se soubory shodují. Příkaz diff má mnohem více možností, ale většina z nich se týká vytváření strojově čitelného výstupu. Ty lze zkontrolovat na Linuxumanuálová stránka

. Možnosti, které jsme použili ve výše uvedených příkladech, vám umožní sledovat všechny rozdíly mezi verzemi vašich textových souborů pomocí příkazového řádku a lidských očí.