Логотип

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

Сравнение файлов построчно с помощью команды 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.

 

Читать  Как использовать команду systemctl для включения и отключения служб

Всё ещё не понятно? Хорошо. Давайте рассмотрим другой пример.

Создайте еще два файла, а именно 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: Это четвёртая строка, но другая.
Сравните и покажите Разницу между Файлами с помощью команды Linux diff

2. Сравнение без учета регистра

-iФлаг в команде diff делает сравнение нечувствительным к регистру, то есть при сравнении файлов прописные (A-Z) и строчные (a-z) буквы будут считаться одинаковыми.

diff -i file1.txt file2.txt

 

Читать  Команда Cal в Linux

Вы можете комбинировать -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

 

Это очень полезно, когда:

  • Вы проверяете, совпадают ли две резервные копии
  • Вы сравниваете поэтапный контент с развернутым
  • Вам нужен краткий обзор без полных различий
Читать  Как командой Sed заменить новую строку пробелом

 

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

Для больших каталогов или в случаях, когда вам нужны контрольные суммы или детальный контроль, лучше использовать rsynccmp, или md5sumdiff лучше всего подходит для поиска текстовых различий, а не двоичных данных или задач, требующих высокой производительности.

 

Заключение

Команда diff — это простой, но мощный инструмент для сравнения файлов и каталогов в Linux. Как только вы разберётесь с форматом вывода и основными параметрами, вы поймёте, что она полезна для устранения неполадок, программирования и системного администрирования.

Попробуйте поэкспериментировать с diff на своих собственных файлах. Вскоре поиск различий станет вашей второй натурой!

Есть вопросы или советы по использованию diff? Пожалуйста, поделитесь ими в комментариях ниже!

Редактор: AndreyEx

Рейтинг: 4.7 (24 голоса)
Если статья понравилась, то поделитесь ей в социальных сетях:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Это может быть вам интересно


Загрузка...

Спасибо!

Теперь редакторы в курсе.

Прокрутить страницу до начала