Příkaz Diff v linuxu se používá k porovnání obsahu dvou souborů řádek po řádku a pokud je nalezen rozdíl, vypíše také rozdíly spolu s čísly řádků. Příkaz Diff lze také použít k porovnání obsahu dvou adresářů.
Příkaz Diff hraje důležitou roli ve skriptu shellu, kde chceme spustit příkaz na základě rozdílu dvou souborů.
syntaxe příkazu diff
$ diff
Výstup příkazu diff může být v následujícím formátu:
- Normální (výchozí)
- Kontext
- Sjednocené
Různé symboly výstupu příkazu diff:
- a -> označuje, že bylo něco přidáno
- c -> označuje, že byl změněn nějaký text
- d -> znamená to, že nějaký text byl smazán
Ve výchozím nastavení příkaz diff zobrazuje výstup v normálním formátu, to znamená, že když je obsah dvou souborů identický, neprodukuje žádný výstup, ale dostaneme výzvu.
V tomto příspěvku probereme příkaz diff s praktickými příklady.
1) Porovnejte dva soubory pomocí příkazu diff
Předpokládejme, že máme dva soubory aachen.txt a sydney.txt a následuje obsah těchto souborů,
[[email protected] ~]# cat aachen.txt Linux Rocks in the open source world, followings are the linux distributions: CentOS Red Hat Ubuntu Debian Linux Mint OpenSUSE Fedora [[email protected] ~]# cat sydney.txt Linux Rocks in the open source world, followings are the linux distributions: CentOS Red Hat Ubuntu Debian Linux Mint OpenSUSE Fedora [[email protected] ~]#
Porovnejme obsah těchto souborů pomocí příkazu diff,
[[email protected] ~]# diff aachen.txt sydney.txt [[email protected] ~]#
Výše uvedený výstup potvrzuje, že oba soubory jsou totožné. Udělejme nějaké změny v aachen.txt, přepišme open source jako „open-source“.
Nyní znovu spusťte příkaz diff,
[[email protected] ~]# diff aachen.txt sydney.txt
Výstup,
Ve výstupu 1c1 označuje, že 1. řádek prvního souboru je třeba změnit, aby byly oba soubory identické.
Vraťme výše uvedenou změnu zpět a přidejte nový řádek „Arch Linux ” v sydeny.txt na konci souboru a znovu spusťte příkaz diff,
Výstup příkazu diff „7a8 ” znamená, že za 7. řádek v prvním souboru musíme přidat další řádek, aby odpovídal 8. řádku druhého souboru.
Odeberme „Arch Linux“ a „Fedora“ ze sydney.txt a poté se pokusíme tyto soubory porovnat,
Výstup příkazu diff „7d6 ” znamená, že musíme odstranit 7. řádek v prvním souboru, abychom se synchronizovali s druhým souborem na řádku číslo 6.
2) Výstup příkazu Diff v kontextu formátu (-c)
Použijte volbu "-c" v příkazu diff k vytvoření výstupu příkazu diff v kontextovém formátu. Příklad je uveden níže,
[[email protected] ~]# diff -c aachen.txt sydney.txt
První dva řádky představují názvy souborů spolu s datem a časem jejich úpravy a symbolem tří hvězdiček („*** “) označuje první soubor a symbol tří pomlček („— “) označuje druhý soubor.
Pouze jedna pomlčka „-“ znamená, že řádek je třeba odstranit, a symbol plus „+“ znamená, že je třeba přidat řádek do souboru. Pokud je jakýkoli řádek, který nevyžaduje žádnou změnu, je před ním dvě mezery.
3) Výstup příkazu Diff v jednotném formátu (-u)
Použijte volbu „-u“ v příkazu diff, pokud chcete vytvořit jeho výstup v jednotném formátu, příklad je znázorněn níže,
[[email protected] ~]# diff -u aachen.txt sydney.txt
Výše uvedený výstup je poněkud podobný kontextovému formátu, ale jednotný formát zobrazuje výstup stručným způsobem, zde první dva řádky označují názvy souborů spolu s datem a časem jejich úpravy..
Tři pomlčky („—“) představují první soubor a symbol tři plus („+++“) představuje druhý soubor, po dvou znak „-1,7“ označuje řádky z prvního souboru a „+1,7“ představuje řádky se pohybují od 2. souboru. Navíc symbol (+Core OS) znamená, že tento řádek je třeba přidat do prvního souboru a symbol pomlčka (-Fedora) znamená, že tento řádek je třeba odstranit z prvního souboru, aby byl totožný s 2. souborem.
4) Při porovnávání souborů ignorujte velká a malá písmena (-i)
Ve výchozím nastavení příkaz diff rozlišuje malá a velká písmena a pokud chcete v příkazu diff ignorovat velká a malá písmena, použijte volbu „-i“, příklad je uveden níže,
Předpokládejme, že máme následující obsah dvou souborů
Spusťte příkaz diff bez jakékoli volby,
[[email protected] ~]# diff aachen.txt sydney.txt 5,6c5,6 < Ubuntu debian < Linux mint --- > Ubuntu Debian > Linux Mint [[email protected] ~]#
Nyní spusťte příkaz diff s volbou -i,
[[email protected] ~]# diff -i aachen.txt sydney.txt [[email protected] ~]#
Jak můžeme vidět na výše uvedeném výstupu, příkaz diff ignoroval vlastnost rozlišující malá a velká písmena, když použijeme volbu -i.
5) Soubory sestav jsou totožné s příkazem diff (-s)
Mohou nastat situace, kdy porovnáváme soubory pomocí příkazu diff a pokud je obsah identický, pak chceme zobrazit zprávu, že soubor je identický, toho lze dosáhnout předáním možnosti ‚-s‘ v příkazu diff,
[[email protected] ~]# cat filex.txt DevOPs Engineer Cloud Stack Engineer Linux System Admin Monitoring Team [[email protected] ~]# cat filey.txt DevOPs Engineer Cloud Stack Engineer Linux System Admin Monitoring Team [[email protected] ~]# diff -s filex.txt filey.txt Files filex.txt and filey.txt are identical [[email protected] ~]#
6) Ignorujte prázdné místo při porovnávání souborů s rozdílem (-b)
Předpokládejme, že máme dva soubory filea.txt a fileb.txt kde bílé mezery nejsou konzistentní, takže pokud použijeme příkaz diff bez jakékoli možnosti v tom, že ukáže rozdíl mezi bílými místy, i když obsah je identický, takže v takových případech můžeme ignorovat nekonzistentní bílá místa v příkazu diff pomocí volby -b , příklad je uveden níže,
[[email protected] ~]# cat filea.txt Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks. [[email protected] ~]# cat fileb.txt Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks. [[email protected] ~]#
Porovnejte soubory bez jakékoli volby pomocí příkazu diff,
[[email protected] ~]# diff filea.txt fileb.txt 1c1 < Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks. --- > Hi, LinuxTechi is a Linux based blog. It contains linux HowTo's and Tips & Tricks. [[email protected] ~]#
Nyní použijte volbu -b ve výše uvedeném příkazu diff
[[email protected] ~]# diff -b filea.txt fileb.txt [[email protected] ~]#
Pokud chcete ignorovat všechna prázdná místa během porovnávání pomocí příkazu diff, použijte „-w ” možnost
[[email protected] ~]# diff -w filea.txt fileb.txt
7) Ignorujte bílé místo na konci řádku během porovnávání (-Z)
Pokud chcete během porovnávání ignorovat zkušební mezeru na konci řádku, použijte „-Z ” možnost
[[email protected] ~]# diff -Z filea.txt fileb.txt
Použijte „-B ” v příkazu diff ignorovat všechny prázdné řádky během porovnávání,
[[email protected] ~]# diff -B filea.txt fileb.txt
8) Porovnejte dva adresáře
Předpokládejme, že máme dva adresáře s názvem lab01 a lab02, tyto mají následující soubory a podadresáře
[[email protected] ~]# ls -l lab01/ total 0 -rw-r--r--. 1 root root 0 Feb 1 17:49 filea.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 fileb.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 filec.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 filed.txt drwxr-xr-x. 2 root root 23 Feb 1 17:50 sitea [[email protected] ~]# ls -l lab02/ total 0 -rw-r--r--. 1 root root 0 Feb 1 17:49 filea.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 fileb.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 filec.txt -rw-r--r--. 1 root root 0 Feb 1 17:49 filed.txt drwxr-xr-x. 2 root root 23 Feb 1 17:50 sitea [[email protected] ~]#
Porovnejme tyto dva adresáře pomocí níže uvedeného příkazu diff,
[[email protected] ~]# diff -qr lab01/ lab02/ [[email protected] ~]#
Kde:
- -q -> instruuje příkaz diff, aby hlásil pouze v případě, že se soubory liší
- -r -> instruuje příkaz diff, aby rekurzivně hledal rozdíl v podadresářích
Když dostaneme prázdný výstup, znamená to, že oba adresáře jsou identické. Pojďme odstranit filed.txt z lab02 a pak se pokusíme porovnat,
[[email protected] ~]# cd lab02/ [[email protected] lab02]# rm -f filed.txt [[email protected] lab02]# cd [[email protected] ~]# diff -qr lab01/ lab02/ Only in lab01/: filed.txt [[email protected] ~]#
Výše uvedený výstup říká, že filed.txt je přítomen pouze v adresáři lab01
9) Přesměrování výstupu příkazu diff do souboru
Výstup příkazu Diff lze přesměrovat do souboru pomocí symbolu „>“. To se stává velmi užitečné ve skriptech shellu, kde chceme provést úlohu pouze v případě, že výstup příkazu diff obsahuje rozdíly.
[[email protected] ~]# diff aachen.txt sydney.txt 9,10d8 < SLES < Puppy Linux [[email protected] ~]# diff aachen.txt sydney.txt > diff.txt [[email protected] ~]# cat diff.txt 9,10d8 < SLES < Puppy Linux [[email protected] ~]#
Další příklad
Porovnejte dva soubory na terminálu vedle sebe
Když použijeme volbu „-y“ při porovnávání dvou souborů pomocí příkazu diff, zobrazí se oba soubory na terminálu vedle sebe.
[[email protected] ~]# diff -y /etc/fstab /tmp/fstab
výstup
Výše uvedený výstup jasně ukazuje rozdíl dvou souborů.
To je vše z tohoto článku, doufám, že nyní lépe rozumíte příkazu diff tím, že si projdete výše uvedené příklady. Neváhejte se podělit o své názory a komentáře.
Přečtěte si také :16 příkladů příkazů Echo v systému Linux
Přečtěte si také : 8 příkladů příkazů Head v systému Linux