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 řádek1
druhé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 řádek2
v prvním souboru.2
zad
symbol znamená, že pokud není řádek smazán, objeví se na řádku2
ve druhém souboru.< Arch Linux
- odstraněný řádek.
4c4,5
- Nahradit (změnit) řádek5
v prvním souboru s řádky4-5
z druhého souboru.< CentOS
- Řádek v prvním souboru, který má být nahrazen.---
- Oddělovač.> Arch Linux
a> 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-numbers
ato-file-line-numbers
– Čísla řádků nebo rozsah řádků oddělených čárkami v prvním a druhém souboru.from-file-line
ato-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
,Fedora
a poslední prázdný řádek jsou v obou souborech stejné. Tyto řádky začínají dvojitou mezerou. - Řada
- Arch Linux
z 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
+ Kubuntu
z druhého souboru neodpovídá ničemu v prvním souboru. - Řádek
! CentOS
z prvního souboru a řádků! Arch Linux
a! CentOS
z 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ář.