Команда diff в Linux — как сравнивать файлы в терминале

Введение
Если вы работаете в Linux без графического интерфейса, привычные GUI-инструменты для сравнения файлов (например, Gedit или Meld) недоступны. В таких условиях приходят на помощь консольные утилиты. Наиболее базовая и повсеместно доступная — команда diff. Она проста по принципу, но её вывод требует небольшого обучения.
Кратко: diff сравнивает два файла построчно и печатает инструкции, какие строки добавить, удалить или заменить, чтобы первый файл стал таким же, как второй.
Важно: diff ориентирован на текстовые файлы. Для бинарных данных используйте cmp или специализированные инструменты.
Синтаксис
diff [OPTION]... FILES- OPTION — опции команды (например, -u для unified-формата).
- FILES — два сравниваемых файла (обычно: оригинал и изменённый).
Для полной документации можно использовать texinfo-версию, если она установлена:
info diffКак читать вывод diff — основные принципы
Вывод diff описывает набор изменений, необходимых для преобразования первого файла в второй. Общая структура:
- Каждая группа изменений начинается с строки вида N[a|d|c]M или N1,N2[a|d|c]M1,M2.
- Первая часть (до буквы) — номер(ы) строки в первом файле (оригинал).
- Буква: a — added (добавить), d — deleted (удалить), c — changed (заменить).
- Вторая часть — номер(ы) строки во втором файле (новый).
- После этой строки идут конкретные строки:
- Строки из первого файла начинаются с ‘<’.
- Строки из второго файла начинаются с ‘>’.
- Разделитель между ними — строка с ‘—‘.
Пример и объяснение ниже помогут закрепить понимание.
Простой пример
file1:
test
test2
test3file2:
test
test23
test3Команда:
diff file1 file2Вывод:
2c2
< test2
---
> test23Разбор: 2c2 означает, что строка 2 в первом файле заменена на строку 2 во втором файле. Строки с ‘<’ и ‘>’ показывают старую и новую версии.
Пример с диапазонами
file1:
Hi all,
This is a diff command tutorial
from HowtoForge.
Hope you'll benefit from it.
Thanks.file2:
Hi all,
Welcome to HowtoForge.
In this tutorial, we'll discuss the diff tool.
Hope you'll find it beneficial.
Thanks.Команда и вывод:
diff file1 file22,4c2,4
< This is a diff command tutorial
< from HowtoForge.
< Hope you'll benefit from it.
---
> Welcome to HowtoForge.
> In this tutorial, we'll discuss the diff tool.
> Hope you'll find it beneficial.Разбор: 2,4c2,4 означает, что строки 2–4 первого файла заменяются на строки 2–4 второго файла.
Добавление и удаление блоков
Если во втором файле вставлен новый блок до существующих строк, diff покажет операцию добавления с номером 0 в первом файле:
Пример вывода при вставке в начало:
0a1,5
> Welcome to HowtoForge.
> In this tutorial, we'll discuss the diff tool.
> Hope you'll find it beneficial.
> Thanks.
>0a1,5 означает: в первый файл нужно добавить (append) строки 1–5 из второго файла перед началом содержимого.
Если после этого требуется удалить строку из первого файла, появится операция удаления, например:
4d8
< Thanks.4d8 читается как: строка 4 первого файла должна быть удалена, чтобы синхронизировать файлы до положения вокруг строки 8 второго файла.
Альтернативы и дополняющие инструменты
- sdiff — показывает различия рядом друг с другом в колонках; удобно для визуального сравнения в терминале.
- vimdiff — использует vim и подсвечивает различия; полезно для редактирования при сравнении.
- diff -u — unified формат, часто используемый в патчах и git.
- git diff — если файлы находятся в git-репозитории, даёт контекст и интеграцию с историей.
- cmp — быстрый побайтовый сравнение бинарных файлов.
Важно: цветные обёртки типа colordiff делают вывод diff читаемее, но не меняют смысл.
Пример: unified diff и применение патча
Unified-формат (-u) даёт контекст вокруг изменений. Пример:
diff -u file1 file2 > changes.patchРезультат можно применить с помощью patch:
patch file1 < changes.patchЭто полезно при отправке исправлений или обмене патчами.
Когда diff не подойдёт
- Бинарные файлы: diff ориентирован на текст. Для бинарных используйте cmp или специализированные средства.
- Большие файлы без контекста: вывод может быть громоздким; используйте -U N для увеличения контекста или фильтруйте вывод.
- Семантические отличия: diff сравнивает строки, но не смысл. Для семантического сравнения кода используйте статический анализ или форматирование перед сравнением.
Быстрые рекомендации и приёмы (cheat sheet)
- Базовый запуск: diff old new
- Показывать только, отличаются ли файлы: diff -q old new
- Unified формат (патчи): diff -u old new
- Игнорировать пробелы: diff -w old new
- Показать различия в виде колонок: sdiff old new
- Цветной вывод: colordiff old new (если установлен)
Пошаговая методика для рутинной работы
- Скопируйте файлы в рабочую папку.
- Сначала выполните diff -q, чтобы понять, отличаются ли файлы.
- Если отличаются, используйте diff -u для патча или sdiff для визуального сравнения.
- Примените patch или внесите правки в редакторе (vimdiff удобен для одновременного редактирования).
- Повторите diff, чтобы убедиться, что файлы синхронизированы.
Ролевые чеклисты
Системный администратор:
- Проверил, что файлы текстовые.
- Использовал diff -q для быстрой проверки.
- При необходимости применил patch и проверил сервисы.
Разработчик:
- Использовал diff -u для создания патча.
- Проверил код линтером/форматером до сравнения.
- Протестировал изменения локально.
Ревьювер:
- Изучил diff -u с достаточным контекстом.
- Убедился, что изменения малоблоковые и понятные.
- Попросил доработки при неочевидных изменениях.
Ментальные модели: как думать о diff
- «Инструкции преобразования»: думайте о выводе как о пошаговом рецепте, как сделать первый файл вторым.
- «Контекст важнее содержания»: наличие соседних строк помогает понять смысл изменения.
- «Строки ≠ смысл»: строки могут отличаться из‑за форматирования, не из‑за логики.
Критерии приёмки
- Вывод diff не содержит несоответствий после правок.
- Для текстовых файлов diff возвращает отсутствие различий.
- Для патчей patch применился без ошибок.
Короткий глоссарий
- diff — утилита сравнения файлов построчно.
- unified diff — формат с контекстными строками, удобный для патчей.
- patch — утилита для применения unified-диффов.
- sdiff — бок о бок сравнение в терминале.
- cmp — побайтовое сравнение (для бинарных файлов).
Заключение
Вывод diff может показаться запутанным сначала, но он следует простой логике: какие строки удалить, добавить или заменить. Освоив чтение строк вида 2c2, 0a1,5 или 4d8, вы сможете эффективно сравнивать файлы на чистом CLI. Для повседневных задач используйте сочетание diff, sdiff и vimdiff; для обмена исправлениями — diff -u и patch.
Примечание: это руководство даёт базу. В man-странице и info diff вы найдёте дополнительные опции и более сложные сценарии.
Ключевые шаги: начните с diff -q, затем diff -u или sdiff по необходимости, и применяйте patch при обмене исправлениями.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента