Сравнение файлов построчно с помощью команды diff в Linux: руководство для начинающих

Если вы работаете с текстовыми файлами в системах Linux или Unix, то рано или поздно столкнётесь с командой diff
. Команда diff — один из самых полезных инструментов для сравнения двух файлов и поиска изменений. В этой статье мы объясним, что делает команда diff
, как использовать её для сравнения двух файлов и поиска различий в Linux на примерах.
Что такое команда diff?
Команда diff (сокращение от «difference (разница)») используется для построчного сравнения содержимого двух файлов и отображения различий между ними. Это мощный инструмент для выявления изменений, особенно в текстовых файлах, таких как код, файлы конфигурации или журналы.
Использование команды Linux diff
Самой простой формой команды diff
является:
diff [OPTION]… FILES
Пример:
diff file1.txt file2.txt
Эта команда сравнивает file1.txt
и file2.txt
и показывает различия построчно.
Понимание вывода различий
Когда вы запускаете diff
, он выводит результат, который поначалу может показаться немного запутанным. Вот как его понять:
- Строки, начинающиеся с
<
, указывают содержимое из первого файла. - Строки, начинающиеся с
>
, указывают содержимое из второго файла. - Числа (подобные
3c3
) показывают номера строк, в которых произошли изменения.
Часто используемые флаги различий
Отметить | Описание |
---|---|
-u | Унифицированный формат (используется в патчах и Git) |
-y | Параллельное сравнение |
-q | Тихий режим – сообщает только о различиях в файлах |
-r | Рекурсивное сравнение каталогов |
--exclude=PATTERN | Пропускать соответствующие файлы / каталоги |
-i | Игнорируйте различия в регистре |
-w | Игнорируйте все различия в пробелах |
-b | Игнорировать изменения в количестве пробелов |
Как сравнить файлы с помощью команды diff в Linux
Допустим, у вас есть два файла, file1.txt
и file2.txt
, со следующим содержимым:
file1.txt:
Строка 1: Это первая строка. Строка 2: Это вторая строка. Строка 3: Это третья строка. Строка 4: Это четвёртая строка.
file2.txt:
Строка 1: Это первая строка. Строка 2: Это вторая строка, но изменённая. Строка 3: Это третья строка. Строка 4: Это четвёртая строка, но другая.
Чтобы сравнить содержимое этих двух файлов с помощью diff
, просто запустите:
diff file1.txt file2.txt
Это сравнение file1.txt
и file2.txt
. Если файлы совпадают, ничего не отображается. Если они отличаются, программа сообщает, как привести один файл в соответствие с другим с помощью дополнений и удалений.
Пример вывода:
2c2 < Строка 2: Это вторая строка. --- > Строка 2: Это вторая строка, но изменённая. 4c4 < Строка 4: Это четвёртая строка. --- > Строка 4: Это четвёртая строка, но другая.
Объяснение выходных данных:
2c2
: Указывает на то, что изменение находится во второй строке обоих файлов (т. е.file1.txt
иfile2.txt
).c
указывает на изменение.< Строка 2: Это вторая строка.
: Строка изfile1.txt
.---
: Разделитель.Строка 2: Это вторая строка, но измененная.
: Строка изfile2.txt
.4c4
: Указывает, что изменение находится в строке 4 в обоих файлах.Строка 4: Это четвертая строка.
: Строка изfile1.txt
.---
: Разделитель.> Строка 4: Это четвертая строка, но другая.
: Строка изfile2.txt
.
Всё ещё не понятно? Хорошо. Давайте рассмотрим другой пример.
Создайте еще два файла, а именно file3.txt
и file4.txt
с некоторым случайным содержимым.
file3.txt:
Привет, мир! Это тест. Linux — это весело.
file4.txt:
Привет, мир! Это демонстрация. Linux — отличная система.
Как вы можете видеть в приведённых выше файлах, кроме первой строки, остальные строки отличаются. Давайте посмотрим, что команда diff
выдаст в этом примере.
diff file3.txt file4.txt
Пример вывода:
2,3c2,3 < Это тест. < Linux — это весело. --- > Это демонстрация. > Linux — это здорово.
Позвольте мне объяснить приведенный выше вывод.
Как мы уже сказали, строки, начинающиеся с <
, взяты из file3.txt
, а строки, начинающиеся с >
, — из file4.txt
.
2,3c2,3
означает, что строки 2-3 в file3.txt
были заменены (c
) на строки 2-3 в file4.txt
.
Основные примеры команд diff для начинающих
Вот несколько важных diff
команд и опций:
1. Показать разницу между файлами
Если мы используем флаг -u
с командой diff
, то вывод отображается в унифицированном формате, который представляет различия в более компактном и удобном для чтения виде.
diff -u file1.txt file2.txt
Пример вывода:
--- file1.txt 2025-05-01 12:47:19.349888344 +0530 +++ file2.txt 2025-05-01 12:47:30.757065330 +0530 @@ -1,4 +1,4 @@ Строка 1: Это первая строка. -Строка 2: Это вторая строка. +Строка 2: Это вторая строка, но изменённая. Строка 3: Это третья строка. -Строка 4: Это четвёртая строка. +Строка 4: Это четвёртая строка, но другая.
2. Сравнение без учета регистра
-i
Флаг в команде diff
делает сравнение нечувствительным к регистру, то есть при сравнении файлов прописные (A-Z
) и строчные (a-z
) буквы будут считаться одинаковыми.
diff -i file1.txt file2.txt
Вы можете комбинировать -i
с другими флагами, например -w
(игнорировать пробелы), для более гибкого сравнения.
3. Игнорируйте все различия в пробелах
Флаг -w
игнорирует ВСЕ различия в пробелах при сравнении файлов, в том числе:
- Пробелы ( )
- Вкладки (
\t
) - Окончания строк (
\r\n
vs\n
) - Любая комбинация / количество пробелов
diff -w file1.txt file2.txt
4. Игнорируйте изменения в количестве пробелов
Флаг -b
игнорирует различия в количестве символов пробела (пробелов/табуляции), но по-прежнему учитывает наличие/положение пробелов.
diff -b file1.txt file2.txt
5. Параллельное сравнение
diff -y file1.txt file2.txt
-y
сравнивает два текстовых файла, file1.txt
и file2.txt
, и показывает их различия рядом друг с другом.
Пример вывода:
Строка 1: Это первая строка. Строка 1: Это первая строка. Строка 2: Это вторая строка. | Строка 2: Это вторая строка, но изменённая. Строка 3: Это третья строка. Строка 3: Это третья строка. Строка 4: Это четвёртая строка. | Строка 4: Это четвёртая строка, но другая.
6. Показывать только в том случае, если файлы отличаются
Вы можете использовать флаг -q
(режим завершения) с командой diff
для отображения только различий в файлах без вывода самих различий.
diff -q file1.txt file2.txt
Если файлы идентичны, он печатает:
Files file1.txt and file2.txt are identical
Если файлы разные, он печатает:
Files file1.txt and file2.txt differ
Он не показывает изменения построчно — только ответ «да» или «нет».
Это полезно, когда:
- Вы хотите проверить целостность файла или изменения в скриптах
- Вы сравниваете резервные копии
- Вам нужен быстрый ответ, не читая выходные данные diff
7. Рекурсивное сравнение каталогов
Команда diff
может рекурсивно сравнивать файлы в двух каталогах с помощью флага -r
.
diff -r dir1/ dir2/
Он просматривает оба каталога, сравнивает файлы с одинаковыми именами и путями и сообщает:
- Какие файлы отличаются
- Какие файлы существуют в одном каталоге, но не в другом
- Необязательно: конкретные различия в строках, как и в случае с отдельными файлами.
Пример вывода:
Only in dir2/: file3.txt Only in dir2/: file4.txt
Это очень полезно, когда:
- Вы проверяете, совпадают ли две резервные копии
- Вы сравниваете поэтапный контент с развернутым
- Вам нужен краткий обзор без полных различий
8. Исключите определенные файлы или типы файлов
Чтобы исключить определённые файлы или типы файлов при использовании diff -r
для сравнения каталогов, можно использовать параметр --exclude
.
Синтаксис:
diff -r --exclude=PATTERN dir1/ dir2/
PATTERN
может быть именем файла, расширением файла или шаблоном подстановочных знаков.- Вы можете использовать это несколько раз, чтобы исключить разные шаблоны.
Давайте рассмотрим несколько примеров использования опции --exclude
с командой diff
.
1. Исключите все .log
файлы:
diff -r --exclude='*.log' dir1/ dir2/
2. Исключите скрытые файлы (dotfiles).:
diff -r --exclude='.*' dir1/ dir2/
3. Исключить каталогnode_modules
:
diff -r --exclude='node_modules' dir1/ dir2/
4. Объедините несколько исключений:
diff -r --exclude='*.log' --exclude='*.tmp' --exclude='backup' dir1/ dir2/
Примечание:
- Шаблон
--exclude
соответствует имени файла или каталога (не полному пути). - Он чувствителен к регистру, если не используется с
--ignore-case
, что влияет только на содержимое строк, а не на пути.
9. Сравнение выходных данных команд
Вы можете использовать подстановку процессов для сравнения выходных данных команд:
diff <(ls dir1) <(ls dir2)
Это сравнивает списки файлов в двух каталогах. Это очень удобно для написания сценариев или проверок.
10. Понимание кодов выхода
diff
может использоваться в скриптах. Возвращает:
0
если файлы одинаковы1
если файлы отличаются2
если произошла ошибка (например, файл отсутствует)
Вы можете использовать это в if
операторах в Bash.
11. Создание исправлений
Вы можете сохранить diff
выходные данные в файл и применить их позже, используя patch
:
diff -u old.txt new.txt > changes.patch patch old.txt < changes.patch
Это полезно при разработке программного обеспечения, резервном копировании и изменении конфигурации.
12. Показать справку по команде Linux diff
Чтобы отобразить раздел справки, используйте --help
.
diff --help
Когда не следует использовать команду diff
Для больших каталогов или в случаях, когда вам нужны контрольные суммы или детальный контроль, лучше использовать rsync
, cmp
, или md5sum
. diff
лучше всего подходит для поиска текстовых различий, а не двоичных данных или задач, требующих высокой производительности.
Заключение
Команда diff
— это простой, но мощный инструмент для сравнения файлов и каталогов в Linux. Как только вы разберётесь с форматом вывода и основными параметрами, вы поймёте, что она полезна для устранения неполадок, программирования и системного администрирования.
Попробуйте поэкспериментировать с diff
на своих собственных файлах. Вскоре поиск различий станет вашей второй натурой!
Есть вопросы или советы по использованию diff
? Пожалуйста, поделитесь ими в комментариях ниже!