Android

Polecenie różnicowe w systemie Linux

How to Use Comm, Diff, and Patch: Linux Terminal 201 - HakTip 169

How to Use Comm, Diff, and Patch: Linux Terminal 201 - HakTip 169

Spisu treści:

Anonim

diff to narzędzie wiersza polecenia, które pozwala porównać dwa pliki linia po linii. Może także porównywać zawartość katalogów.

Polecenie diff jest najczęściej używane do utworzenia poprawki zawierającej różnice między jednym lub większą liczbą plików, które można zastosować za pomocą polecenia patch .

Jak korzystać z polecenia diff

Składnia polecenia diff jest następująca:

diff… FILES

Polecenie diff może wyświetlać dane wyjściowe w kilku formatach, przy czym najczęściej są to format normalny, kontekstowy i jednolity. Dane wyjściowe zawierają informacje o tym, które wiersze w plikach należy zmienić, aby stały się identyczne. Jeśli pliki są zgodne, dane wyjściowe nie są generowane.

Aby zapisać dane wyjściowe polecenia w pliku, użyj operatora przekierowania:

diff file1 file2 > patch

, użyjemy następujących dwóch plików, aby wyjaśnić, jak działa polecenie diff :

plik 1

Ubuntu Arch Linux Debian CentOS Fedora plik2

Kubuntu Ubuntu Debian Arch Linux Centos Fedora

Normalny format

W najprostszej postaci, gdy polecenie diff jest uruchamiane na dwóch plikach tekstowych bez żadnej opcji, generuje dane wyjściowe w normalnym formacie:

diff file1 file2

Dane wyjściowe będą wyglądać mniej więcej tak:

0a1 > Kubuntu 2d2 < Arch Linux 4c4, 5 < CentOS --- > Arch Linux > Centos

Normalny format wyjściowy składa się z jednej lub więcej sekcji opisujących różnice. Każda sekcja wygląda następująco:

change-command < from-file-line… --- > to-file-line…

0a1 , 2d2 i 4c4, 5 to polecenia zmiany. Każde polecenie zmiany zawiera następujące elementy, od lewej do prawej:

  • Numer linii lub zakres linii w pierwszym pliku. Specjalny znak zmiany. Numer linii lub zakres linii w drugim pliku.

Znak zmiany może być jednym z następujących:

  • a - Dodaj linie. c - Zmień linie. d - Usuń linie.

Po poleceniu zmiany pojawiają się pełne wiersze, które są usuwane ( < ) i dodawane do pliku ( > ).

Wyjaśnijmy wynik:

  • 0a1 - Dodaj wiersz 1 drugiego pliku na początku pliku 1 (po wierszu 0 ).
    • > Kubuntu - Linia z drugiej linii, która jest dodawana do pierwszego pliku, jak opisano powyżej.
    2d2 - Usuń wiersz 2 z pierwszego pliku. Symbol 2 po d oznacza, że ​​jeśli linia nie zostanie usunięta, pojawi się na linii 2 w drugim pliku.
    • < Arch Linux - usunięta linia.
    4c4, 5 - Zamień (zmień) wiersz 5 w pierwszym pliku na linie 4-5 z drugiego pliku.
    • < CentOS - Linia w pierwszym pliku do zamiany. --- - Separator. > Arch Linux i > Centos - Linie z drugiego pliku zastępujące linię w pierwszym pliku.

Format kontekstowy

Gdy używany jest kontekstowy format wyjściowy, polecenie diff wyświetla kilka linii kontekstu wokół linii, które różnią się między plikami.

Opcja -c mówi diff aby wygenerował dane wyjściowe w formacie kontekstowym:

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

Dane wyjściowe zaczynają się od nazw i znaczników czasu, jeśli porównywane pliki oraz co najmniej jedna sekcja opisująca różnice. Każda sekcja wygląda następująco:

*************** *** from-file-line-numbers **** from-file-line… --- to-file-line-numbers ---- to-file-line…

  • from-file-line-numbers i to-file-line-numbers - Numery linii lub zakres linii oddzielony przecinkami odpowiednio w pierwszym i drugim pliku. from-file-line i to-file-line - Linie, które się różnią i linie kontekstu:
    • Linie zaczynające się od dwóch spacji są liniami kontekstu, liniami, które są takie same w obu plikach. Linie zaczynające się od symbolu minus ( - ) to linie, które nie odpowiadają nic w drugim pliku. Brakuje linii w drugim pliku. Linie zaczynające się od symbolu plus ( + ) to linie, które nie odpowiadają nic w pierwszym pliku. Brak linii w pierwszym pliku. Linie zaczynające się od wykrzyknika ( ! ) To linie, które są zmieniane między dwoma plikami. Każda grupa linii zaczynająca się od ! z pierwszego pliku ma odpowiadające dopasowanie w drugim pliku.

Wyjaśnijmy najważniejsze części wyniku:

  • W tym przykładzie mamy tylko jedną sekcję opisującą różnice. *** 1, 6 **** i --- 1, 7 ---- mówi nam zakres wierszy z pierwszego i drugiego pliku, które są zawarte w tej sekcji. Linie Ubuntu , Debian , Fedora i ostatnia pusta linia jest taka sama w obu plikach. Te wiersze zaczynają się od podwójnej spacji. Linia - Arch Linux z pierwszego pliku nie odpowiada nic w drugim pliku. Chociaż ta linia istnieje również w drugim pliku, pozycje są różne. Linia + Kubuntu z drugiego pliku nie odpowiada nic w pierwszym pliku. Linia ! CentOS ! CentOS od pierwszego pliku i linii ! Arch Linux ! Arch Linux i ! CentOS ! CentOS z drugiego pliku są zmieniane między plikami.

Domyślnie liczba linii kontekstu wynosi domyślnie trzy. Aby określić inny numer, użyj opcji -C ( --contexts ):

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

Ujednolicony format

Zunifikowany format wyjściowy jest ulepszoną wersją formatu kontekstowego i daje mniejszy wynik.

Użyj opcji -u , aby powiedzieć diff aby wydrukował dane wyjściowe w ujednoliconym formacie:

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

Dane wyjściowe zaczynają się od nazw i znaczników czasu plików oraz jednej lub więcej sekcji opisujących różnice. Każda sekcja ma następującą formę:

*************** @@ from-file-line-numbers to-file-line-numbers @@ line-from-files…

  • @@ from-file-line-numbers to-file-line-numbers @@ - Numer linii lub zakres linii z pierwszego i drugiego pliku zawartego w tej sekcji. line-from-files - Linie, które się różnią i linie kontekstu:
    • Linie zaczynające się od dwóch spacji są liniami kontekstu, linie, które są takie same w obu plikach. Linie zaczynające się od symbolu minus ( - ) to linie, które są usuwane z pierwszego pliku. Linie zaczynające się od znaku plus ( + ) to linie, które są dodawane z pierwszego pliku.

Zignoruj ​​wielkość liter

Jak można zauważyć w powyższych przykładach, polecenie diff domyślnie rozróżnia małe i wielkie litery.

Użyj opcji -i , aby powiedzieć diff aby ignorował wielkość liter:

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

Wniosek

Porównywanie plików tekstowych pod kątem różnic jest jednym z najczęstszych zadań administratorów systemów Linux.

Komenda diff porównuje pliki linia po linii. Aby uzyskać więcej informacji, wpisz man diff w swoim terminalu.

terminal różnicowy