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

Что такое diff?
diff — это утилита, которая показывает различия между двумя текстовыми файлами. Название происходит от английского слова “difference”. diff включён в POSIX-стандарт, поэтому доступен практически во всех Unix-подобных системах: на большинстве дистрибутивов Linux, на macOS и BSD.
Если у вас полноценный дистрибутив, скорее всего, вы видите GNU diffutils. В минимальных системах diff может входить в состав BusyBox или Toybox; в BSD — как отдельная реализация. Просмотреть версию и руководство можно через команду:
man diffБазовое сравнение двух файлов
Чтобы сравнить два файла, передайте их пути как аргументы:
diff file1 file2Вывод показывает блоки различий. Строки из первого файла помечаются символом “<”, из второго — “>”. Перед блоком указывается операция и номера строк: например, “1c1” означает “начиная с строки 1, изменить строку 1”. Буквы в этих обозначениях означают:
- a — append (вставить/добавить)
- c — change (заменить)
- d — delete (удалить)
Пример: пусть file1 содержит:
Hello
World
Goodbyeа file2 содержит:
Hello
Earth
GoodbyeКоманда diff file1 file2 выдаст примерно:
2c2
< World
---
> EarthЭто читабельно и полезно при ручном анализе изменений.
Сравнение рядом и unified-формат
Чтобы увидеть файлы рядом (side-by-side), используйте опцию -y:
diff -y file1 file2Это удобно для визуального сличения строк в виде двух колонок.
Опция -u генерирует unified diff — компактный контекстный формат, который часто используют для патчей и для отправки изменений по почте:
diff -u file1 file2 > changes.patchUnified-вывод содержит строки контекста и метки добавления/удаления (+/-). Исторически такой формат широко использовался в open-source: разработчики присылали .patch-файлы по email, а получатель применял их командой patch.
Применение патчей и рабочий процесс
Типичная последовательность для создания и применения патча:
- Подготовьте чистую рабочую директорию и внесите изменения в локальные файлы.
- Создайте unified-патч:
diff -u original/file.c modified/file.c > myfix.patch- Отлично: теперь отправьте myfix.patch или примените локально:
patch -p0 < myfix.patchИли, если вы используете Git:
git apply myfix.patchВажно: перед применением патча убедитесь, что контекст совпадает (строки вокруг изменений не сильно изменились), иначе patch сообщит конфликт.
Ограничения и случаи, когда diff не подойдёт
Important: diff работает с текстом. Он плохо подходит для бинарных файлов (например, изображений, PDF, сжатых архивов) — для них используйте специальные инструменты сравнения или конвертируйте в текстовый формат (например, hexdump).
Другие ограничения:
- Порядок строк. diff выявляет изменения по строкам. Если строки просто переупорядочены, diff покажет удаление и добавление, а не «перемещение».
- Различия в пробелах и окончаниях строк. Для игнорирования пробельных различий используйте опции:
- -w — игнорировать все различия в пробелах
- -b — игнорировать различия в количестве пробельных символов
- -B — игнорировать пустые строки
- -a — считать бинарные файлы как текстовые (с осторожностью)
- Различия в кодировке и окончаниях строк (CRLF vs LF) тоже могут мешать; применяйте dos2unix или –strip-trailing-cr при необходимости.
Если вам нужно понимать перемещения блоков кода или семантические изменения, лучше подходят инструменты анализа AST или системное сравнение в VCS (git diff с опциями или специализированные дифф-инструменты).
Альтернативы и сопутствующие инструменты
- git diff — интегрирован в Git, показывает изменения в индексе и рабочей копии; поддерживает цветовую подсветку и опции сравнения коммитов.
- colordiff — обёртка над diff, добавляющая цвет для удобства чтения в терминале.
- meld, kdiff3, Beyond Compare — графические визуальные сравниватели для складки и слияния изменений.
- diff3 — сравнение трёх версий одновременно (полезно при слияниях).
Выбор зависит от задач: для простых проверок достаточно diff; для слияний и обзора кода — Git и графические инструменты.
Быстрый чек-лист для разработчика
- Перед созданием патча: зафиксируйте состояние репозитория или отпишите текущие изменения.
- Для человекочитаемых патчей используйте
diff -u. - Проверяйте патч локально:
patch -p0 < myfix.patchилиgit apply --check myfix.patch. - Для визуального сравнения используйте
diff -yили GUI-инструмент. - Игнорируйте пробелы при форматных правках:
diff -w.
Шпаргалка команд
- diff file1 file2 — базовое сравнение
- diff -y file1 file2 — вывод рядом (side-by-side)
- diff -u file1 file2 — unified diff (патч)
- diff -w / -b / -B — игнорировать пробельные различия
- diff –strip-trailing-cr — удалить завершающие CR (если поддерживается)
- patch -p0 < file.patch — применить патч
- git apply file.patch — применить патч в Git
Мини-методология: как подготовить понятный патч
- Сделайте минимальные и атомарные изменения (одна логическая правка — один патч).
- Оставляйте контекст (не удаляйте лишние строки вокруг изменения).
- Используйте
diff -uдля генерации патча. - Протестируйте патч локально и выполните
git apply --checkперед отправкой. - В описании патча укажите цель и кратко — ключевые изменения.
1-строчный глоссарий
- Unified diff — компактный контекстный формат патча с метками +/-.
- Side-by-side — визуальное расположение сравниваемых строк в двух колонках.
- Patch — файл, содержащий изменения, применяемые программой patch или git apply.
Итоги
diff — простой, надёжный и мощный инструмент для сравнения текстовых файлов в Unix-подобных системах. Он незаменим для быстрого анализа изменений, подготовки патчей и интеграции в рабочие процессы слияния. Для более сложных задач используйте git diff, графические диффы или специализированные инструменты.
Important: если ваш рабочий процесс включает бинарные файлы, переупорядочивание строк или семантические изменения, дополняйте diff другими инструментами.
Ключевые выводы:
- diff показывает точечные отличия строк; -u и -y — самые полезные опции.
- Для создания патчей используйте
diff -uи применяйтеpatch/git apply. - При проблемах с пробелами и окончаниями строк применяйте специальные опции или преобразование формата.
Похожие материалы
Как исправить чёрный экран на Chromebook
Как сбросить контроллер PS5 — быстро и просто
Решение ошибок установки Microsoft 365 и Office 2021
VirtualBox и Windows 10 на macOS — установка
Как узнать, кто подключён к вашей Wi‑Fi сети