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]… FILESPrzykład:
diff file1.txt file2.txtTo 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
| Flaga | Opis |
|---|---|
-u | Jednolity format (używany w poprawkach i Git) |
-y | Porównanie obok siebie |
-q | Tryb cichy - raportuje tylko, jeśli pliki się różnią |
-r | Rekurencyjne porównanie katalogów |
--exclude=WZÓR | Pomiń dopasowane pliki/katalogi |
-i | Ignoruj różnice między wielkimi i małymi literami |
-w | Ignoruj wszystkie różnice w białych znakach |
-b | Ignoruj 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.txtTo 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.Wyjaśnienie wyniku:
2c2: Oznacza, że zmiana znajduje się w linii 2 w obu plikach (tj.file1.txtifile2.txt).coznacza zmienione.< Linia 2: To jest druga linia.: Linia zfile1.txt.---: Separator.> Linia 2: To jest druga linia, ale zmieniona.: Linia zfile2.txt.4c4: Wskazuje, że zmiana znajduje się w linii 4 w obu plikach.< Linia 4: To jest czwarta linia.: Linia zfile1.txt.---: Separator.> Linia 4: To jest czwarta linia, ale inna.: Linia zfile2.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.txtPrzykł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.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.txtMoż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\nvs\n) - Dowolna kombinacja/ilość białych znaków
diff -w file1.txt file2.txt4. 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.txt5. 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.txtJeśli pliki są identyczne, wypisuje:
Files file1.txt and file2.txt are identicalJeśli pliki są różne, zostanie wyświetlone:
Files file1.txt and file2.txt differNie 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.txtTo 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/PATTERNmoż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
--excludepasuje 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 same1jeśli pliki się różnią2jeś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.patchJest 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 --helpKiedy 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!

