Wyszukiwanie w witrynie

Jak porównać pliki linia po linii za pomocą polecenia diff w Linuksie


Jeśli pracujesz z plikami tekstowymi w systemach Linux lub Unix, prędzej czy później natkniesz się na polecenie diff. Polecenie diff jest jednym z najważniejszych narzędzi do porównywania dwóch plików w celu znalezienia zmian. W tym przewodniku wyjaśnimy, co robi polecenie diff, jak go używać do porównywania dwóch plików i znajdowania różnic w Linuxie na przykładach.

Co to jest polecenie diff?

Polecenie diff (skrót od „difference”, czyli różnica) służy do porównywania zawartości dwóch plików linia po linii i wyświetlania różnic między nimi. Jest to potężne narzędzie do identyfikowania zmian, szczególnie w plikach tekstowych, takich jak kod, pliki konfiguracyjne czy logi.

Użycie polecenia diff w Linux

Najbardziej podstawowa forma polecenia diff to:

diff [OPTION]… FILES

Przykład:

diff file1.txt file2.txt

To polecenie porównuje file1.txt i file2.txt oraz pokazuje różnice linia po linii.

Rozumienie wyniku diff

Gdy uruchamiasz diff, generuje ono wynik, który na pierwszy rzut oka może wydawać się nieco mylący. Oto jak go zrozumieć:

  • Linie zaczynające się od < wskazują zawartość z pierwszego pliku.
  • Linie zaczynające się od > wskazują treść z drugiego pliku.
  • Liczby (takie jak 3c3) pokazują numery linii, w których zaszły zmiany.

Najczęściej używane flagi diff

FlagaOpis
-uJednolity format (używany w poprawkach i Git)
-yPorównanie obok siebie
-qTryb cichy - raportuje tylko, jeśli pliki się różnią
-rRekurencyjne porównanie katalogów
--exclude=WZÓRPomiń dopasowane pliki/katalogi
-iIgnoruj różnice między wielkimi i małymi literami
-wIgnoruj wszystkie różnice w białych znakach
-bIgnoruj zmiany w liczbie spacji

Jak porównywać pliki przy użyciu polecenia diff w Linux

Załóżmy, że masz dwa pliki, file1.txt i file2.txt, z następującą zawartością:

file1.txt:

Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third line.
Line 4: This is the fourth line.

file2.txt:

Line 1: This is the first line.
Line 2: This is the second line, but changed.
Line 3: This is the third line.
Line 4: This is the fourth line, but different.

Aby porównać zawartość tych dwóch plików za pomocą diff, po prostu uruchom:

diff file1.txt file2.txt

To porównuje file1.txt i file2.txt. Jeśli pliki są takie same, nic nie pokazuje. Jeśli różnią się, informuje, jak sprawić, by jeden plik pasował do drugiego, używając dodawania i usuwania.

Przykładowy wynik:

2c2
< Line 2: This is the second line.
---
> Line 2: This is the second line, but changed.
4c4
< Line 4: This is the fourth line.
---
> Line 4: This is the fourth line, but different.

Porównaj pliki za pomocą polecenia diff w Linuksie

Wyjaśnienie wyniku:

  • 2c2: Oznacza, że zmiana znajduje się w linii 2 w obu plikach (tj. file1.txt i file2.txt). c oznacza zmienione.
  • < Linia 2: To jest druga linia.: Linia z file1.txt.
  • ---: Separator.
  • > Linia 2: To jest druga linia, ale zmieniona.: Linia z file2.txt.
  • 4c4: Wskazuje, że zmiana znajduje się w linii 4 w obu plikach.
  • < Linia 4: To jest czwarta linia.: Linia z file1.txt.
  • ---: Separator.
  • > Linia 4: To jest czwarta linia, ale inna.: Linia z file2.txt.

Wciąż nie rozumiesz? OK. Zobaczmy kolejny przykład.

Utwórz dwa kolejne pliki o nazwach file3.txt i file4.txt z jakąś losową zawartością.

file3.txt:

Hello, world!  
This is a test.  
Linux is fun.  

file4.txt:

Hello, world!  
This is a demo.  
Linux is great.  

Jak widać w powyższych plikach, z wyjątkiem pierwszej linii, pozostałe linie są różne. Zobaczmy, co polecenie diff pokaże w tym przykładzie.

diff file3.txt file4.txt

Przykładowy wynik:

2,3c2,3
< This is a test.  
< Linux is fun.  
---
> This is a demo.  
> Linux is great.  

Pozwól mi wyjaśnić powyższy wynik.

Jak już wspomniałem, linie zaczynające się od < pochodzą z file3.txt, a linie zaczynające się od > pochodzą z file4.txt.

2,3c2,3 oznacza, że linie 2-3 w file3.txt zostały zmienione (c) na linie 2-3 w file4.txt.

Podstawowe przykłady polecenia diff dla początkujących

Oto kilka podstawowych poleceń i opcji diff:

1. Pokaż różnicę między plikami

Jeśli użyjemy flagi -u z poleceniem diff, wyświetla ono wynik w formacie zunifikowanym, który przedstawia różnice w bardziej zwartej i czytelnej formie.

diff -u file1.txt file2.txt

Przykładowy wynik:

--- file1.txt    2025-05-01 12:47:19.349888344 +0530
+++ file2.txt    2025-05-01 12:47:30.757065330 +0530
@@ -1,4 +1,4 @@
 Line 1: This is the first line.
-Line 2: This is the second line.
+Line 2: This is the second line, but changed.
 Line 3: This is the third line.
-Line 4: This is the fourth line.
+Line 4: This is the fourth line, but different.

Porównaj i Pokaż Różnice Między Plikami za pomocą Polecenia Linux diff

2. Porównanie niewrażliwe na wielkość liter

Flaga -i w poleceniu diff sprawia, że porównanie jest bez rozróżniania wielkości liter, co oznacza, że traktuje litery wielkie (A-Z) i małe (a-z) jako identyczne podczas porównywania plików.

diff -i file1.txt file2.txt

Możesz połączyć -i z innymi flagami, takimi jak -w (ignoruj białe znaki), aby uzyskać bardziej elastyczne porównania.

3. Ignoruj wszystkie różnice w białych znakach

Flaga -w ignoruje WSZYSTKIE różnice w białych znakach podczas porównywania plików, w tym:

  • Spacje ( )
  • Tabulatory (\t)
  • Zakończenia linii (\r\n vs \n)
  • Dowolna kombinacja/ilość białych znaków
diff -w file1.txt file2.txt

4. Ignoruj zmiany w ilości białych znaków

Flaga -b ignoruje różnice w ilości znaków białych (spacje/tabulatory), ale nadal zwraca uwagę na obecność/położenie znaków białych.

diff -b file1.txt file2.txt

5. Porównanie obok siebie

diff -y file1.txt file2.txt

-y porównuje dwa pliki tekstowe, file1.txt i file2.txt, i pokazuje ich różnice obok siebie.

Przykładowy wynik:

Line 1: This is the first line.                    Line 1: This is the first line.
Line 2: This is the second line.                  | Line 2: This is the second line, but changed.
Line 3: This is the third line.                    Line 3: This is the third line.
Line 4: This is the fourth line.                  | Line 4: This is the fourth line, but different.

6. Pokaż tylko, jeśli pliki się różnią

Możesz użyć flagi -q (tryb cichy) z poleceniem diff, aby tylko pokazać, czy pliki różnią się, bez wyświetlania rzeczywistych różnic.

diff -q file1.txt file2.txt

Jeśli pliki są identyczne, wypisuje:

Files file1.txt and file2.txt are identical

Jeśli pliki są różne, zostanie wyświetlone:

Files file1.txt and file2.txt differ

Nie pokazuje zmian linia po linii - tylko odpowiedź tak/nie.

Jest to przydatne, gdy:

  • Chcesz sprawdzić integralność pliku lub zmiany w skryptach
  • Porównujesz kopie zapasowe
  • Potrzebujesz szybkiej odpowiedzi bez czytania wyniku różnic

7. Rekurencyjne porównywanie katalogów

Polecenie diff może rekurencyjnie porównywać pliki w dwóch katalogach przy użyciu opcji -r.

diff -r dir1/ dir2/

Przechodzi przez oba katalogi, porównuje pliki o tych samych nazwach i ścieżkach i raportuje:

  • Które pliki są różne
  • Które pliki istnieją w jednym katalogu, ale nie w drugim
  • Opcjonalnie: konkretne różnice w liniach, tak jak w przypadku pojedynczych plików

Przykładowy wynik:

Only in dir2/: file3.txt
Only in dir2/: file4.txt

To jest bardzo przydatne, kiedy:

  • Sprawdzasz, czy dwa kopie zapasowe są takie same
  • Porównujesz zawartość etapowaną z wdrożoną
  • Chcesz szybkiego przeglądu bez pełnych różnic

8. Wyklucz niektóre pliki lub typy plików

Aby wykluczyć określone pliki lub typy plików podczas używania diff -r do porównywania katalogów, możesz użyć opcji --exclude.

Składnia:

diff -r --exclude=PATTERN dir1/ dir2/
  • PATTERN może być nazwą pliku, rozszerzeniem pliku lub wzorcem wieloznacznym.
  • Możesz użyć tego wielokrotnie, aby wykluczyć różne wzorce.

Zobaczmy kilka przykładów, jak używać opcji --exclude z poleceniem diff.

1. Wyklucz wszystkie pliki .log:

diff -r --exclude='*.log' dir1/ dir2/

2. Wyklucz pliki ukryte (pliki kropkowe):

diff -r --exclude='.*' dir1/ dir2/

3. Wyklucz katalog node_modules:

diff -r --exclude='node_modules' dir1/ dir2/

4. Połącz wiele wyłączeń:

diff -r --exclude='*.log' --exclude='*.tmp' --exclude='backup' dir1/ dir2/

Uwaga:

  • Wzorzec --exclude pasuje do nazwy podstawowej pliku lub katalogu (nie do pełnej ścieżki).
  • Jest czułe na wielkość liter, chyba że użyte z --ignore-case, co wpływa tylko na zawartość linii, a nie na ścieżki.

9. Porównywanie wyników poleceń

Możesz użyć podstawienia procesu, aby porównać wyniki poleceń:

diff <(ls dir1) <(ls dir2)

To porównuje listę plików w dwóch katalogach. Jest to bardzo przydatne do skryptów lub kontrolowania.

10. Rozumienie kodów wyjścia

diff może być używany w skryptach. Zwraca:

  • 0, jeśli pliki są takie same
  • 1 jeśli pliki się różnią
  • 2 jeśli wystąpił błąd (np. brak pliku)

Możesz użyć tego w instrukcjach if w Bash.

11. Tworzenie poprawek

Możesz zapisać wynik diff do pliku i zastosować go później używając patch:

diff -u old.txt new.txt > changes.patch
patch old.txt < changes.patch

Jest to przydatne w tworzeniu oprogramowania, tworzeniu kopii zapasowych i zmianach konfiguracji.

12. Pokaż pomoc polecenia diff w Linux

Aby wyświetlić sekcję pomocy, użyj --help.

diff --help

Kiedy nie używać polecenia diff

Dla dużych katalogów lub gdy potrzebujesz sum kontrolnych albo szczegółowej kontroli, rsync, cmp lub md5sum mogą być lepsze. diff sprawdza się najlepiej w przypadku różnic opartych na tekście, a nie zadań binarnych czy wrażliwych na wydajność.

Wniosek

Polecenie diff jest prostym, a jednocześnie potężnym narzędziem do porównywania plików i katalogów w systemie Linux. Gdy zrozumiesz jego format wyjściowy i kluczowe opcje, okaże się przydatne przy rozwiązywaniu problemów, programowaniu i administracji systemem.

Spróbuj eksperymentować z diff na własnych plikach. Wykrywanie różnic wkrótce stanie się dla ciebie drugą naturą!

Masz jakieś pytania lub wskazówki dotyczące używania diff? Prosimy, podziel się nimi w komentarzach poniżej!