diff je nástroj příkazového řádku, který vám umožňuje porovnávat dva soubory řádek po řádku. Může také porovnávat obsah adresářů.
diff příkaz se nejčastěji používá k vytvoření opravy obsahující rozdíly mezi jedním nebo více soubory, které lze použít pomocí patch příkaz.
Jak používat diff Příkaz #
Syntaxe pro diff příkaz je následující:
diff [OPTION]... FILES
diff příkaz může zobrazit výstup v několika formátech, přičemž nejběžnější je normální, kontextový a jednotný formát. Výstup obsahuje informace o tom, které řádky v souborech je třeba změnit, aby byly identické. Pokud se soubory shodují, nebude vytvořen žádný výstup.
Chcete-li uložit výstup příkazu do souboru, použijte operátor přesměrování:
diff file1 file2 > patch
V tomto článku použijeme následující dva soubory k vysvětlení diff příkaz funguje:
Ubuntu
Arch Linux
Debian
CentOS
Fedora
soubor2Kubuntu
Ubuntu
Debian
Arch Linux
Centos
Fedora
Normální formát #
Ve své nejjednodušší podobě, když diff příkaz je spuštěn na dvou textových souborech bez jakékoli volby, vytváří výstup v normálním formátu:
diff file1 file2
Výstup bude vypadat nějak takto:
0a1
> Kubuntu
2d2
< Arch Linux
4c4,5
< CentOS
---
> Arch Linux
> Centos
Normální výstupní formát se skládá z jedné nebo více částí, které popisují rozdíly. Každá sekce vypadá takto:
change-command
< from-file-line...
---
> to-file-line...
0a1 , 2d2 a 4c4,5 jsou příkazy změny. Každý příkaz změny obsahuje následující zleva doprava:
- Číslo řádku nebo rozsah řádků v prvním souboru.
- Zvláštní znak změny.
- Číslo řádku nebo rozsah řádků ve druhém souboru.
Znak změny může být jeden z následujících:
a- Přidejte řádky.c- Změňte řádky.d- Odstraňte řádky.
Po příkazu change následují celé řádky, které jsou odstraněny (< ) a přidán do souboru (> ).
Pojďme si vysvětlit výstup:
0a1- Přidejte řádek1druhého souboru na začátku souboru1 (za řádkem0).> Kubuntu- Řádek z druhého řádku, který je přidán do prvního souboru, jak je popsáno výše.
2d2- Smazat řádek2v prvním souboru.2zadsymbol znamená, že pokud není řádek smazán, objeví se na řádku2ve druhém souboru.< Arch Linux- odstraněný řádek.
4c4,5- Nahradit (změnit) řádek5v prvním souboru s řádky4-5z druhého souboru.< CentOS- Řádek v prvním souboru, který má být nahrazen.---- Oddělovač.> Arch Linuxa> Centos- Řádky z druhého souboru nahrazující řádek v prvním souboru.
Kontextový formát #
Když je použit kontextový výstupní formát, diff zobrazí několik řádků kontextu kolem řádků, které se mezi soubory liší.
-c volba říká diff k vytvoření výstupu v kontextu formátu:
diff -c file1 file2
*** file1 2019-11-25 21:00:26.422426523 +0100
--- file2 2019-11-25 21:00:36.342231668 +0100
***************
*** 1,6 ****
Ubuntu
- Arch Linux
Debian
! CentOS
Fedora
--- 1,7 ----
+ Kubuntu
Ubuntu
Debian
! Arch Linux
! Centos
Fedora
Výstup začíná jmény a časovými razítky v případě porovnávaných souborů a jednou nebo více sekcemi, které popisují rozdíly. Každá sekce vypadá takto:
***************
*** from-file-line-numbers ****
from-file-line...
--- to-file-line-numbers ----
to-file-line...
from-file-line-numbersato-file-line-numbers– Čísla řádků nebo rozsah řádků oddělených čárkami v prvním a druhém souboru.from-file-lineato-file-line- Liší se řádky a řádky kontextu:- Řádky začínající dvěma mezerami jsou řádky kontextu, řádky, které jsou v obou souborech stejné.
- Řádky začínající znakem mínus (
-) jsou řádky, které neodpovídají ničemu ve druhém souboru. V druhém souboru chybí řádky. - Řádky začínající znakem plus (
+) jsou řádky, které neodpovídají ničemu v prvním souboru. V prvním souboru chybí řádky. - Řádky začínající vykřičníkem (
!) jsou řádky, které se mění mezi dvěma soubory. Každá skupina řádků začínající!z prvního souboru má odpovídající shodu ve druhém souboru.
Pojďme si vysvětlit nejdůležitější části výstupu:
- V tomto příkladu máme pouze jednu sekci popisující rozdíly.
*** 1,6 ****a--- 1,7 ----nám říká rozsah řádků z prvního a druhého souboru, které jsou zahrnuty v této sekci.- Řádky
Ubuntu,Debian,Fedoraa poslední prázdný řádek jsou v obou souborech stejné. Tyto řádky začínají dvojitou mezerou. - Řada
- Arch Linuxz prvního souboru neodpovídá ničemu v druhém souboru. Přestože tento řádek existuje i ve druhém souboru, pozice jsou odlišné. - Řádek
+ Kubuntuz druhého souboru neodpovídá ničemu v prvním souboru. - Řádek
! CentOSz prvního souboru a řádků! Arch Linuxa! CentOSz druhého souboru se mezi soubory mění.
Ve výchozím nastavení je počet kontextových řádků nastaven na tři. Chcete-li zadat jiné číslo, použijte -C (--contexts ) možnost:
diff -C 1 file1 file2
*** file1 2019-11-25 21:00:26.422426523 +0100
--- file2 2019-11-25 21:00:36.342231668 +0100
***************
*** 1,5 ****
Ubuntu
- Arch Linux
Debian
! CentOS
Fedora
--- 1,6 ----
+ Kubuntu
Ubuntu
Debian
! Arch Linux
! Centos
Fedora
Sjednocený formát #
Jednotný výstupní formát je vylepšenou verzí kontextového formátu a vytváří menší výstup.
Použijte -u možnost sdělit diff pro tisk výstupu v jednotném formátu:
diff -u file1 file2
--- file1 2019-11-25 21:00:26.422426523 +0100
+++ file2 2019-11-25 21:00:36.342231668 +0100
@@ -1,6 +1,7 @@
+Kubuntu
Ubuntu
-Arch Linux
Debian
-CentOS
+Arch Linux
+Centos
Fedora
Výstup začíná jmény a časovými razítky souborů a jednou nebo více sekcemi, které popisují rozdíly. Každá sekce má následující podobu:
***************
@@ from-file-line-numbers to-file-line-numbers @@
line-from-files...
@@ from-file-line-numbers to-file-line-numbers @@- Číslo řádku nebo rozsah řádků z prvního a druhého souboru obsaženého v této sekci.line-from-files- Liší se řádky a řádky kontextu:- Řádky začínající dvěma mezerami jsou řádky kontextu, řádky, které jsou v obou souborech stejné.
- Řádky začínající znakem mínus (
-) jsou řádky, které jsou odstraněny z prvního souboru. - Řádky začínající znakem plus (
+) jsou řádky, které se přidají z prvního souboru.
Ignorovat velikost písmen #
Jak si můžete všimnout ve výše uvedených příkladech, diff příkaz ve výchozím nastavení rozlišuje velká a malá písmena.
Použijte -i možnost sdělit diff ignorovat velká a malá písmena:
diff -ui file1 file2
--- file1 2019-11-25 21:00:26.422426523 +0100
+++ file2 2019-11-25 21:00:36.342231668 +0100
@@ -1,6 +1,7 @@
+Kubuntu
Ubuntu
-Arch Linux
Debian
+Arch Linux
CentOS
Fedora
Závěr č.
Porovnání rozdílů v textových souborech je jedním z nejběžnějších úkolů správců systémů Linux.
diff příkaz porovná soubory řádek po řádku. Pro více informací napište man diff ve vašem terminálu.
Pokud máte nějaké dotazy, zanechte prosím níže komentář.