Jak porównywać pliki za pomocą diff

Jak porównywać pliki za pomocą diff

Narzędzie różnicowe wynosi, w zdecydowanej większości przypadków, domyślnie zainstalowana w każdym rozkładowi Linuksa. Program służy do obliczania i wyświetlania różnic między zawartością dwóch plików. Jest używany głównie podczas pracy z kodem źródłowym dwa porównaj te same wersje dwóch plików i podkreśl różnice między nimi. W tym artykule dowiemy się różnych trybów, w których diff może działać, i jak utworzyć plik diff, który można później zastosować jako łatkę z narzędziem łatki.

W tym samouczku się nauczysz:

  • Jak używać diff
  • Jak wyświetlić wyjście różnorodne na dwóch kolumnach podczas używania diff w trybie normalnym
  • Jak odczytać wyjście różnorodne w trybie normalnym, kontekstowym i ujednoliconym
  • Jak utworzyć plik diff i zastosować go jako łatkę z narzędziem łatki
Jak porównywać pliki za pomocą diff

Zastosowane wymagania i konwencje oprogramowania

Wymagania oprogramowania i konwencje linii poleceń Linux
Kategoria Wymagania, konwencje lub wersja oprogramowania
System Niezależny dystrybucja
Oprogramowanie Różnica, łatka
Inny Nic
Konwencje # - Wymaga, aby podane Linux -commands były wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
$-wymaga wykonania Linux-commands jako zwykłego niewidzianego użytkownika

Narzędzie różnorodne

różnica narzędzie porównuje linię plików według linii; Jego składnia jest bardzo prosta:

Pliki $ diff [opcja] 

Wszystko, co musimy zrobić, to wywołać program, a następnie ścieżkę plików, które chcemy porównać. Zanim będziemy mogli przyjrzeć się niektórym przykładom użytkowania, musimy nauczyć się czytać wyniki narzędzia i jakie jest znaczenie symboli używanych w wytworzonym przez niego wyjściu. Możemy je podsumować w poniższej tabeli:

Symbol Oznaczający
A Potrzebne jest „dodanie”, aby zawartość dwóch plików pasowała
C Potrzebne jest akcja „zmiana”, aby zawartość dwóch plików pasowała
D Potrzebna jest akcja „Usuń”, aby zawartość dwóch plików dopasowała
< Wskazuje linię z pierwszego pliku
> Wskazuje linię z drugiego pliku


Możemy teraz zobaczyć kilka przykładów podstawowego wykorzystania różnic. Załóżmy, że mamy dwa pliki, o nazwie LOTR0.tekst I LOTR1.tekst. Treść pierwszego pliku jest następujący:

Trzy pierścienie dla elf-królów pod niebo, siedem dla karłowców w ich kamiennych salach, dziewięć dla śmiertelnych ludzi skazanych na śmierć, jeden dla ciemnego pana na jego ciemnym tronie na krainie Mordor, gdzie leżą cienie. Jeden pierścień, aby rządzić nimi wszystkich, jeden pierścień, aby je znaleźć, jeden pierścień, aby przynieść je wszystkie, a w ciemności wiąże je, w krainie Mordor, gdzie leżą cienie # 

Z pewnością rozpoznałeś wiersz „Pierścień” z książki „Władcy pierścieni”. Teraz przypuśćmy drugi plik, LOTR1.tekst, Zamiast tego zawiera następujące wiersze:

# Wiersz pierścieniowy w czarnej mowie Mordora Trzy pierścienie dla elf-królów pod niebo, siedem dla krasnoludów w ich salach kamiennych, dziewięć dla śmiertelnych ludzi skazanych na śmierć, jeden dla ciemnego pana na jego ciemnym tronie W krainie Mordor, gdzie leżą cienie. Ash Nazg Durbatulûk, Ash Nazg Gimbatul, Ash Nazg Thrakatulûk, Agh Burzum-ishi Krimpatul, w krainie Mordor, gdzie leżą cienie 

Treść dwóch plików jest dość podobna, ale nie identyczna. Uruchommy różnica narzędzia na nich i zobacz, jakie wyniki wytwarza:

$ diff Lotr0.TXT LOTR1.TXT 0A1> # Wiersz pierścieniowy w czarnej mowie Mordora 6,7C7,8 < One Ring to rule them all, One Ring to find them,  Ash nazg durbatulûk, ash nazg gimbatul, > Ash Nazg Thrakatulûk, Agh Burzum-Iishi Krimpatul, 9d9 < # end 

W pierwszym wierszu wyjścia możemy odczytać 0A1; co to znaczy? W takim przypadku jesteśmy powiadomieni, że dla pierwszego pliku, który pasuje do zawartości drugiego, na początku (wiersz 0), należy „dodać nową linię” (A), który odpowiada pierwszej linii (1) drugiego pliku. Co to za linia? Ten zgłoszony po > symbol na drugim wierszu wyjścia:

> # Wiersz pierścieniowy w czarnej mowie Mordora 

Ma to sens: linia nie istnieje w pierwszym pliku, więc należy ją dodać dla zawartości dwóch plików, aby dopasować.

Kontynuujmy. Widzimy następującą notację 6,7C7,8: to oznacza, że ​​linie 6 Do 7 w pierwszym pliku (6,7) należy zmienić, aby dopasować linie 7 Do 8 (7,8) int drugi plik. Jak należy je zmienić? Linie z pierwszego pliku, które możemy rozróżnić, ponieważ poprzedzone przez < symbol, są:

< One Ring to rule them all, One Ring to find them, < One Ring to bring them all, and in the darkness bind them, 

Należy je zmienić na następujące wiersze drugiego pliku, które można zauważyć, ponieważ są poprzedzone przez > symbol w wyjściu różnicowym:

> Ash Nazg Durbatulûk, Ash Nazg Gimbatul,> Ash Nazg Thrakatulûk, Agh Burzum-Iishi Krimpatul, 

Linie z pierwszego pliku, a linie z drugiego, w wyjściu, są oddzielone trzema dystansami: (---).

Wreszcie mamy 9d9 notacja: oznacza to, że aby zawartość dwóch plików dopasowała się, wiersz 9 W pierwszym pliku (# end) należy usunąć w celu dopasowania linii 9 drugiego pliku.

Wyświetlanie wyjściowego obok siebie

W powyższych przykładach widzimy, że wyjście wytwarzane przez narzędzie różnorodne są zorganizowane „pionowo”. Jeśli wolimy, możemy zrobić, aby był sformatowany i wyświetlany za pomocą dwóch kolumn. Wszystko, co musimy zrobić, to użyć -y opcja (krótka
Do --obok siebie):

$ diff -y Lotr0.TXT LOTR1.txt> # Wiersz pierścieniowy w czarnej mowie Mordora Trzy pierścienie dla elf-królów pod niebo, trzy pierścienie dla elf-królów pod niebo, siedem dla karłowców w ich salach kamiennych, siedem dla krasnoludów -Lordowie w swoich kamiennych salach, dziewięć dla śmiertelnych ludzi skazanych na śmierć, dziewięć dla śmiertelnych ludzi skazanych na śmierć, jeden dla Mrocznego Pana na jego ciemnym tronie dla Mrocznego Pana na jego ciemnym tronie na krainie Mordoru, gdzie cienie kłamstwo. W krainie Mordor, gdzie leżą cienie. Jeden pierścień, aby rządzić nimi wszystkich, jeden pierścień, aby je znaleźć, | Ash Nazg Durbatulûk, Ash Nazg Gimbatul, jeden pierścień, który przyniesie ich wszystkie, a w ciemności ich wiąże, | Ash Nazg Thrakatulûk, Agh Burzum-ishi Krimpatul, w krainie Mordor, gdzie cienie leżą w krainie Mordor, gdzie leżą cienie # < 

Zawartość pierwszego pliku jest wyświetlana w lewej kolumnie, a druga, w prawej stronie. Możemy łatwo dostrzec różnice między nimi: jakie linie istnieją tylko w jednym z dwóch i jakie są różne linie. -y Opcji można użyć tylko podczas pracy z diff w trybie „normalnym”, co jest domyślne. Inne tryby istnieją: mówimy o nich w następnej sekcji.

Normalny, kontekst i tryb jednolitego

Domyślnie narzędzie Diff działa w normalna tryb i daje wyjście podobne do tego, które widzieliśmy w poprzednich przykładach. Istnieją jednak inne dwa tryby, których możemy użyć: kontekst I ujednolicony tryb. Spójrzmy
na nich.

Tryb kontekstowy

Tryb kontekstowy można używać, wywołując program z -C opcja (skrót --kontekst). W naszym przypadku spowodowałoby to następujące dane wyjściowe:

$ diff -c lotr0.TXT LOTR1.TXT *** LOTR0.TXT 2021-03-13 16:10:25.248286081 +0100 --- LOTR1.TXT 2021-03-13 15:30:54.060911632 +0100 ***************** *** 1,9 **** Trzy pierścienie dla elf-król , Dziewięć dla śmiertelnych ludzi skazanych na śmierć, jeden dla Mrocznego Pana na jego ciemnym tronie w krainie Mordoru, gdzie leżą cienie. ! Jeden pierścień, aby rządzić nimi wszystkie, jeden pierścień, aby, ! Jeden pierścień, aby przynieść je wszystkie, a w ciemności wiąże je, w krainie Mordoru, gdzie leżą cienie- # end --- 1,9 ---- + # wiersz pierścieniowy w czarnej mowie Mordora Trzy pierścienie dla Elf-królowie pod niebo, siedem dla karłowców w swoich kamiennych salach, dziewięć dla śmiertelnych ludzi skazanych na śmierć, jeden dla ciemnego pana na jego ciemnym tronie na krainie Mordoru, gdzie leżą cienie. ! Ash Nazg Durbatulûk, Ash Nazg Gimbatul, ! Ash Nazg Thrakatulûk, Agh Burzum-ishi Krimpatul, w krainie Mordor, gdzie leżą cienie 


Rzućmy okiem na ten wynik. Przede wszystkim widzimy, że dwa pliki są odwoływane przy użyciu różnych symboli: *** dla pierwszego i --- dla drugiego.

Pierwsze dwa wiersze zawierają informacje o dwóch plikach. Możemy zobaczyć:

  • Nazwa pliku
  • Czas modyfikacji pliku w strefie czasu (w tym przypadku +0100)

Pierwsze dwie linie są oddzielone od reszty wyjściowej o 15 gwiazdki (***************).

To, co widzimy natychmiast po separatorze, to notacja, która określa zakres linii pierwszego pliku zgłoszonego w wyjściu, w tym przypadku wierszy od 1 do 9 (1,9). Po tej notacji same linie są zgłaszane. To samo dzieje się dla drugiego pliku. Widzimy, że niektóre linie są poprzedzone przez niektóre symbole; Zobaczmy, jakie jest ich znaczenie:

Symbol Oznaczający
! Linie prefiksowane przez ten symbol w pierwszym pliku należy zmienić na linie poprzedzone przez niego w drugim pliku, aby zawartość dwóch plików pasowała
- Linie poprzedzone tym symbolem w pierwszym pliku powinny zostać usunięte, aby zawartość dwóch plików pasowała
+ Linie w drugim pliku poprzedzonym tym symbolem należy dodać do pierwszego pliku dla zawartości dwóch plików, aby dopasować

Tryb ujednolicony

Użyć różnica narzędzie w trybie „Unified” musimy go wywołać za pomocą -u opcja, która jest krótką formą --ujednolicony. W tym przypadku wyglądałoby wyjście różnic w trybie Unified:

$ diff -u lotr0.TXT LOTR1.TXT --- LOTR0.TXT 2021-03-13 16:10:25.248286081 +0100 +++ LOTR1.TXT 2021-03-13 15:30:54.060911632 +0100 @@ -1,9 +1,9 @@ +# Wiersz pierścieniowy w Czarnym Mordorze Trzy pierścienie dla elfów pod niebo, siedem dla krasnoludów w ich korytarzach, dziewięć dla śmiertelnych ludzi skazanych na śmierć, jeden dla Mrocznego Pana na jego ciemnym tronie w krainie Mordoru, gdzie leżą cienie. -Jeden pierścień, aby rządzić nimi wszystkich, jeden pierścień, aby je znaleźć, -jeden pierścień, aby przynieść je wszystkie, a w ciemności wiąże je, +Ash Nazg Durbatulûk, Ash Nazg Gimbatul, +Ash Nazg Thrakatulûk, Agh Burzum -ishi Krumpatul, w Kraina Mordoru, gdzie leżą cienie -# koniec 

Pierwsze dwie linie wyprodukowane, gdy diff są wywoływane z -u opcja, są takie same w trybie „kontekst” i wyświetla informacje o dwóch plikach. Jedyną dużą różnicą jest to, że wyjście nie jest oddzielone w zależności od pliku, do którego należy: wszystkie linie są „zjednoczone”.

Tworzenie pliku diff i zastosowanie go jako łatki

Załóżmy, że chcemy zastosować niezbędne zmiany w zawartości pierwszego pliku, którego użyliśmy w poprzednich przykładach, LOTR0.tekst, tak, że został zaktualizowany, aby dopasować treść drugiego pliku, LOTR1.tekst; Jak byśmy mogli kontynuować? Aby osiągnąć nasz cel, możemy użyć skrawek użyteczność i zastosuj Plik diff do oryginalnego. A Plik diff Zawiera wyjście Diff, więc aby utworzyć jedno, wszystko, co musimy zrobić, to przekierować wyjście narzędzia:

$ diff -u lotr0.TXT LOTR1.TXT> LOTR.skrawek 


Po uzyskaniu naszego pliku diff możemy zastosować niezbędne zmiany do oryginalnego pliku za pomocą narzędzia Patch:

$ patch -b lotr0.TXT LOTR.skrawek 

Wywołaliśmy skrawek używając -B Opcja: Nie jest to obowiązkowe, ale jest przydatne, ponieważ tworzy, aby utworzyć kopię zapasową oryginalnego pliku przed zastosowaniem łatki (w tym przypadku zostanie nazwana LOTR0.tekst.Orig). Argumenty my
dostarczone są:

  • Nazwa oryginalnego pliku, na którym należy zastosować łatkę
  • Nazwa pliku zawierająca łatkę.

Po zastosowaniu łatki LOTR0.tekst Plik powinien być identyczny z LOTR1.tekst. Możemy go zweryfikować, używając ponownie diff, co ten czas nie powinien wytworzyć żadnego wyjścia:

$ diff Lotr0.TXT LOTR1.tekst 

Wnioski

W tym samouczku uczymy się, jak używać diff, aby obliczyć różnice między dwoma plikami. Widzieliśmy, jakie są tryby, w których można użyć różnicy i jakie jest znaczenie symboli używanych w wyjściu różnicowym. Wreszcie widzieliśmy, jak utworzyć plik diff i jak zastosować go jako łatkę za pomocą narzędzia Patch.

Powiązane samouczki Linux:

  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Mastering Bash Script Loops
  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Samouczek debugowania GDB dla początkujących
  • Jak odbudować pakiet za pomocą systemu kompilacji Arch Linux
  • Zagnieżdżone pętle w skryptach Bash
  • Jak montować obraz ISO na Linux
  • Hung Linux System? Jak uciec do wiersza poleceń i…
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux