Как сравнивать файлы в Linux с помощью diff

Что такое diff?
diff — это утилита для поиска и отображения различий между двумя текстовыми файлами. Одним предложением: diff показывает, какие строки отличаются между двумя версиями текста.
Ключевая идея: diff не изменяет файлы сам по себе — он описывает различия в виде набора операций (append, change, delete), которые при желании можно применить автоматически.
Важно: diff реализован в рамках POSIX, поэтому присутствует почти во всех Unix-подобных системах (Linux, macOS, BSD). На большинстве дистрибутивов Linux доступна GNU-версия; на минимальных — реализация из BusyBox/Toybox.
Чтобы узнать, какая версия у вас установлена, откройте man:
man diffБыстрое сравнение двух файлов
Чтобы сравнить два текстовых файла, просто передайте их пути как аргументы:
diff file1 file2Вывод показывает строки, отличающиеся между двумя файлами. Строки из первого файла помечаются символом «<», строки из второго — «>». Дополнительно diff использует коды операций: a — add (добавить/append), c — change (изменить), d — delete (удалить). Например, 1c1 означает «в строке 1 первого файла изменить на строку 1 второго файла».
Пример типичного вывода:
1c1
< old line
---
> new lineЭто говорит: заменить old line на new line.
Режимы отображения и полезные опции
- Side-by-side (побочно): показывает файлы в двух колонках. Удобно для быстрого визуального сравнения.
diff -y file1 file2- Unified (объединённый, наиболее распространённый формат патчей): показывает контекстные строки и изменения в виде «hunk» — используется для создания патчей, которые легко читать и применять.
diff -u file1 file2
Опция -u часто используется в открытых проектах: авторы отправляют такие патчи по email, а получатели применяют их через patch или git apply.
Другие полезные флаги:
-r— рекурсивное сравнение директорий.-q— кратко: сообщает только, разные ли файлы.--strip-trailing-cr— игнорировать различия в символах перевода строки CR (полезно при смешанных CRLF/LF).--ignore-all-space/--ignore-space-change— игнорировать пробелы/табуляции.
Создание и применение патчей
Создать unified-патч:
diff -u original.c modified.c > changes.patchПрименить патч с помощью программы patch:
patch < changes.patchИли через Git (если патч совместим):
git apply changes.patchСовет: перед применением патча всегда просмотрите содержимое changes.patch и протестируйте изменения в изолированной ветке.
Когда diff не подходит — ограничения и подводные камни
- Бинарные файлы: базовый diff предназначен для текста; для двоичных данных нужны специальные инструменты (например, bsdiff, cmp, hexdump).
- Большие файлы: при работе с очень большими файлами вывод может быть громоздким и медленным.
- Порядок строк: diff чувствителен к порядку. Для сравнения наборов строк без порядка нужны другие подходы (сортировка + diff или специализированные утилиты).
- Различия в кодировке и окончаниях строк (CRLF vs LF) могут давать ложные изменения — используйте фильтрацию или опции для игнорирования пробелов/концов строк.
Когда diff «не работает»: если требуется семантическое сравнение кода (изменение имени переменной без смысловой нагрузки, переструктурирование функций и т. п.), стоит использовать инструменты статического анализа или специализированные diff-движки для AST.
Альтернативы и сопутствующие инструменты
- git diff — встроенный в Git, понимает контекст репозитория и индекс.
- meld, kdiff3, beyond compare — графические инструменты для наглядного сравнения и слияния.
- vimdiff — сравнениe в терминале с возможностью редактирования.
- diff3 — для трёхстороннего слияния (полезно при конфликте).
- colordiff — вывод diff с цветами для удобства чтения в терминале.
- Онлайн-сервисы — удобно для быстрой проверки без установки.
Выбор зависит от сценария: для единичного сравнения подойдёт diff; для работы с историей и ветвлением — git diff; для визуального слияния — meld/vimdiff.
Ментальные модели и мини‑методология
Ментальная модель: думайте о diff как о рецепте преобразования — он описывает шаги, чтобы превратить file1 в file2.
Короткая методология при внесении изменений в проект:
- Локально сделайте изменения и проверьте их.
- Создайте unified-патч:
diff -u original modified > changes.patch. - Просмотрите патч:
less changes.patch. - Примените патч в целевой среде и запустите тесты.
- Во время ревью используйте
diff -uилиgit diffдля удобства.
Шпаргалка (cheat sheet)
| Команда | Что делает |
|---|---|
diff file1 file2 | Базовое сравнение двух файлов |
diff -y file1 file2 | Side-by-side сравнение |
diff -u file1 file2 | Unified diff (патч) |
diff -r dir1 dir2 | Рекурсивное сравнение директорий |
diff --ignore-all-space | Игнорировать все пробелы |
patch < changes.patch | Применить патч |
Пример быстрого рабочего процесса:
# создать патч
diff -u old.txt new.txt > fix.patch
# просмотреть патч
less fix.patch
# применить патч
patch < fix.patchРолевые чек-листы
Разработчик:
- Сделать минимальные, тестируемые изменения.
- Создать
diff -uи проверить его. - Добавить поясняющий комментарий к патчу.
Ревьюер:
- Применить патч в отдельной ветке или рабочем каталоге.
- Проверить читаемость, безопасность, отсутствие побочных эффектов.
- Запустить локальные тесты и линтеры.
Системный администратор:
- Использовать
diff -rдля сравнения конфигураций. - Игнорировать служебные файлы и бэкапы при сравнении.
Критерии приёмки
- Патч читаем и содержит минимально необходимые изменения.
- Тесты проходят локально и в CI.
- В документации или в описании коммита указана цель изменений.
Важно: не применять патчи без резервного копирования критичных системных файлов.
Заключение
diff — простой, но мощный инструмент для сравнения текста. Он остаётся полезным даже в эпоху распределённых систем контроля версий: diff -u формирует универсальные патчи, а diff -y облегчает визуальную оценку отличий. Для нетекстовых или семантически сложных сравнений используйте специализированные инструменты.
Краткое резюме
- diff показывает строковые различия и поддерживает режимы side-by-side и unified.
- Unified-формат удобен для создания патчей и коллективной работы.
- Если требуется семантический анализ или работа с бинарными файлами, подберите альтернативу.
Примечание: если вы предпочитаете GUI или интегрированные инструменты, попробуйте meld, vimdiff или возможности сравнения в вашей IDE.