GNU/Linux >> Znalost Linux >  >> Linux

Jak provést řádkové porovnání souborů v Linuxu pomocí příkazu diff - Část II

V první části této série výukových programů příkazů rozdíl jsme diskutovali o základech příkazu, včetně toho, jak funguje a jak lze porozumět výstupu, který vytváří. I když je s touto utilitou příkazového řádku rozhodně spojeno trochu učení, stojí za to se ji naučit, zejména pokud vaše každodenní práce zahrnuje provádění úloh souvisejících se soubory na počítačích Linux s pouze CLI.

Za předpokladu, že již znáte základní použití příkazu diff, v tomto tutoriálu probereme různé možnosti příkazového řádku, které nástroj poskytuje, prostřednictvím několika snadno srozumitelných příkladů.

Ale než budeme pokračovat, mějte na paměti, že všechny příklady v tomto tutoriálu byly testovány na Ubuntu 14.04 s Bash verze 4.3.11(1) a rozdíl verze 3.3.

 

Možnosti příkazu Rozdíl

1. Nahlásit, když jsou soubory identické

Ve výchozím nastavení, když příkaz diff zjistí, že porovnávané soubory jsou identické, neprodukuje žádný výstup.

$ diff file1 file2
$

Existuje však možnost příkazového řádku (-s), pomocí které můžete přinutit příkaz, aby to oznámil ve výstupu:

$ diff -s file1 file2
Files file1 and file2 are identical

2. Zkopírovaný kontext a Sjednocený kontext

V zásadě se jedná o dva různé formáty, ve kterých může příkaz diff vytvářet svůj výstup. Zkopírovaný kontext je povolen pomocí volby příkazového řádku -c, zatímco Sjednocený kontext je povolen pomocí -u. Následuje příklad prvního příkladu:

$ diff -c file1 file2
*** file1 2016-12-29 09:36:47.175597647 +0530
--- file2 2016-12-29 09:19:55.799558326 +0530
***************
*** 1,3 ****
Hi
! Helllo
Bye
--- 1,3 ----
Hi
! Hello
Bye

Takže ve výstupním formátu Copied context jsou odlišné řádky označeny vykřičníkem (!).

A zde je příklad formátu Unified context:

$ diff -u file1 file2
--- file1 2016-12-29 09:36:47.175597647 +0530
+++ file2 2016-12-29 09:19:55.799558326 +0530
@@ -1,3 +1,3 @@
Hi
-Helllo
+Hello
Bye

V tomto výstupním formátu + a - symboly před řádky označují verze odlišného řádku: '-' když řádek v souboru1 chybí v souboru2 , '+' na řádku v souboru2 byl přidán do souboru1.

3. Vytvořte 'ed' skript

Příkaz diff je také schopen vytvářet příkazy, které může editor 'ed' použít k převodu původního souboru (v našich příkladech zde soubor1) na nový soubor (soubor2). Zde je návod, jak to udělat:

Předpokládejme, že soubor1 a soubor2 obsahují následující změnu:

$ diff file1 file2
2c2
< Helllo
---
> Hello

Nyní použijte volbu -e příkazového řádku k vytvoření výstupu, kterému editor 'ed' rozumí, a přesměrujte tento výstup do souboru:

diff -e file1 file2 > out

Tady je to, co vyšlo obsahuje v tomto případě:

2c
Hello
.

Dále je potřeba přidat příkaz 'w' na konec out soubor.

2c
Hello
.
w

Nyní spusťte následující příkaz:

ed - file1 < out

A uvidíte, že soubor1 a soubor2 jsou nyní totožné.

$ diff file1 file2
$

Další informace o této funkci najdete zde.

4. Vytvořte výstup ve dvou sloupcích

Normálně příkaz diff vytváří výstup následujícím způsobem:

$ diff file1 file2
2c2
< Helllo
---
> Hello

Existuje však volba příkazového řádku (-y), která řídí diff, aby vytvořil výstup ve dvou samostatných sloupcích. Zde je příklad:

$ diff -y file1 file2
Hi                               Hi
Helllo                         | Hello
Bye                              Bye

Jak můžete vidět, tento výstupní formát používá '|' k označení řádků, které se liší.

5. Skrýt běžné čáry

Pokud budete sledovat výstup zobrazený v předchozí části (bod 4 výše), všimnete si, že s -y volba příkazového řádku, diff - ve výstupu - vytváří také společné řádky. V případě, že potřebujete potlačit tyto identické řádky, můžete použít --suppress-common-lines možnost.

[email protected]:~$ diff -y --suppress-common-lines file1 file2
Helllo                                   | Hello

6. Zobrazit funkci C každá změna je v 

Pro případy, kdy k porovnání dvou souborů v jazyce C použijete diff, je k dispozici volba příkazového řádku (-p), která obslužnému programu nařídí, aby přesně ukázal, ve které funkci C se každá změna nachází. Předpokládejme například, že se jedná o dva soubory C:

soubor1.c:

#include<stdio.h>

void compare(float x, float y)
{
if(x == y) // incorrect way
{
printf("\n EQUAL \n");
}
}


int main(void)
{
compare(1.234, 1.56789);

return 0;
}

soubor2.c:

#include<stdio.h>

void compare(float x, float y)
{
if(x == y)
{
printf("\n EQUAL \n");
}
}


int main(void)
{
compare(1.234, 1.56789);

return 0;
}

Zde je výstup při normálním porovnání obou souborů:

$ diff file1.c file2.c 
5c5
< if(x == y) // incorrect way
---
> if(x == y)

A zde je výstup, kdy jsou soubory porovnávány pomocí -p možnost:

$ diff -p file1.c file2.c 
*** file1.c 2016-12-29 11:45:36.587010816 +0530
--- file2.c 2016-12-29 11:46:39.823013274 +0530
***************
*** 2,8 ****

void compare(float x, float y)
{
! if(x == y) // incorrect way
{
printf("\n EQUAL \n");
}
--- 2,8 ----

void compare(float x, float y)
{
! if(x == y)
{
printf("\n EQUAL \n");
}

Takže jak vidíte, pomocí -p , diff vám poskytne podrobnější pohled na to, kde je změna, a označí různé řádky pomocí vykřičníku (!).

7. Rekurzivně porovnejte podadresáře

Příkaz diff také umožňuje rekurzivně porovnávat podadresáře, ale to není jeho výchozí chování. Chci tím říct, že pokud vezmete následující případ:

$ diff diff-files/ second-diff-files/
diff diff-files/file1 second-diff-files/file1
1c1
< Hi
---
> i
diff diff-files/file2 second-diff-files/file2
2c2
< Hello
---
> ello

Příkaz diff porovnal pouze soubory v adresářích nejvyšší úrovně, ale pokud použijete volbu příkazového řádku -r (což je pro rekurzivní diff), uvidíte, že jsou porovnány sudé soubory přítomné v podadresářích:

$ diff -r diff-files/ second-diff-files/
diff -r diff-files/file1 second-diff-files/file1
1c1
< Hi
---
> i
diff -r diff-files/file2 second-diff-files/file2
2c2
< Hello
---
> ello
diff -r diff-files/more-diff-files/file1 second-diff-files/more-diff-files/file1
1c1
< Hi
---
> i
diff -r diff-files/more-diff-files/file2 second-diff-files/more-diff-files/file2
2c2
< Hello
---
> ello

8. Nakládat s chybějícími soubory jako s prázdnými

Příkaz diff také poskytuje možnost, pomocí které můžete nástroj nasměrovat tak, aby chybějící soubory považoval za prázdné. Pokud například porovnáte soubor1 se souborem3 (který neexistuje), výchozí chování diff je vyvolání chyby:

$ diff file1 file3
diff: file3: No such file or directory

To samo o sobě není špatné; ve skutečnosti to dává dokonalý smysl. Ale mohou nastat případy, kdy byste nechtěli, aby příkaz diff v takových situacích vyvolal chybu (i když je součástí bash skriptu, může být?), pak pro tyto scénáře můžete použít volbu -N příkazového řádku to nutí příkaz považovat chybějící soubory za prázdné a pokračovat v porovnání.

$ diff -N file1 file3
1,5d0
< Hi
<
< Helllo
<
< Bye

Závěr

Pokud si řádně projdete oba díly této série výukových programů a procvičíte si všechny příklady, které články obsahují, nebude příliš složité tvrdit, že nástroj nakonec budete ovládat dobře. Samozřejmě jsme v této sérii nemohli diskutovat o všem souvisejícím s rozdílem, ale buďte si jisti, že mnoho důležitých vlastností/funkcí bylo pokryto.

Pro ty, kteří se chtějí o nástroji dozvědět více, je tu pro vás manuálová stránka. A nemluvě o tom, že byste měli tento nástroj často používat s různými sadami souborů, abyste mohli simulovat různé případy použití.


Linux
  1. Jak provádět řádkové porovnání souborů v Linuxu pomocí příkazu diff

  2. Jak restartovat Linux pomocí příkazového řádku

  3. Jak komprimovat a extrahovat soubory pomocí příkazu tar v systému Linux?

  1. Jak zabít proces v Linuxu pomocí příkazu?

  2. Jak třídit soubory v Linuxu pomocí příkazu Sort

  3. Jak bezpečně přenášet soubory pomocí příkazu SCP v systému Linux

  1. Jak přejmenovat soubory v Linuxu

  2. Jak vytvořit řídké soubory v Linuxu pomocí příkazu „dd“.

  3. Příklady příkazů diff v Linuxu