Linux сравнить 2 файла

Обновлено: 30.06.2024

Иногда возникает необходимость сравнить несколько файлов между собой. Это может понадобиться при анализе разницы между несколькими версиями конфигурационного файла или просто для сравнения различных файлов. В Linux для этого есть несколько утилит, как для работы через терминал, так и в графическом интерфейсе.

В этой статье мы рассмотрим как выполняется сравнение файлов Linux. Разберем самые полезные способы, как для терминала, так и в графическом режиме. Сначала рассмотрим как выполнять сравнение файла linux с помощью утилиты diff.

Сравнение файлов diff

$ diff опции файл1 файл2

Можно передать больше двух файлов, если это нужно. Перед тем как перейти к примерам, давайте рассмотрим опции утилиты:

Это были основные опции утилиты, теперь давайте рассмотрим как сравнить файлы Linux. В выводе утилиты кроме, непосредственно, отображения изменений, выводит строку в которой указывается в какой строчке и что было сделано. Для этого используются такие символы:

Вот содержимое наших тестовых файлов:


Теперь давайте выполним сравнение файлов diff:
$ diff file1 file2


В результате мы получим строчку: 2,3c2,4. Она означает, что строки 2 и 3 были изменены. Вы можете использовать опции для игнорирования регистра:
$ diff -i file1 file2

Можно сделать вывод в две колонки:
$ diff -y file1 file2


А с помощью опции -u вы можете создать патч, который потом может быть наложен на такой же файл другим пользователем:
$ diff -u file1 file2


Чтобы обработать несколько файлов в папке удобно использовать опцию -r:
$ diff -r



Как видите, все очень просто. Но не очень удобно. Более приятно использовать графические инструменты.

Сравнение файлов Linux с помощью GUI

Существует несколько отличных инструментов для сравнения файлов в linux в графическом интерфейсе. Вы без труда разберетесь как их использовать. Давайте рассмотрим несколько из них:

1. Kompare


2. DiffMerge


  • Поддержка сравнения каталогов;
  • Интеграция с просмотрщиком файлов;
  • Настраиваемая.

3. Meld


Это легкий инструмент для сравнения и объединения файлов. Он позволяет сравнивать файлы, каталоги, а также выполнять функции системы контроля версий. Программа создана для разработчиков и имеет такие особенности:

  • Сравнение двух и трех файлов;
  • Использование пользовательских типов и слов;
  • Режим автоматического слияния и действия с боками текста;
  • Поддержка Git, Mercurial, Subversion, Bazar и многое другое.

4. Diffuse


  • Подсветка синтаксиса;
  • Сочетания клавиш для удобной навигации;
  • Поддержка неограниченного числа отмен;
  • Поддержка Unicode;
  • Поддержка Git, CVS, Darcs, Mercurial, RCS, Subversion, SVK и Monotone.

5. XXdiff


  • Поверхностное или рекурсивное сравнение одного или двух файлов и каталогов;
  • Подсветка отличий;
  • Интерактивное объединение;
  • Поддержка внешних инструментов сравнения, такие как GNU Diff, SIG Diff, Cleareddiff и многое другое;
  • Расширяемость с помощью сценариев;
  • Настраиваемость.

6. KDiff3



Photo by Ryan Stone on Unsplash

Представьте, что однажды утром вы просыпаетесь и обнаруживаете, чтоб ваши продакшен-системы «лежат» из-за бага, который только предстоит найти. Один из наихудших кошмаров, верно?

Также оказывается, что для восстановления системы вам нужно сравнить код в двух версиях. Давление растет, все вокруг паникуют (и это понятно).

К счастью, в Linux есть утилита под названием diff, которая вам поможет.

Что из себя представляет команда diff в Linux?

Сравнивать вручную долго и тяжело, к тому же велика вероятность ошибок. Поэтому Linux предоставляет вам мощную встроенную утилиту под названием diff. Ее применение позволяет сэкономить время и силы.

Синтаксис команды diff

Команда diff имеет следующий синтаксис:

Поэтому в выводе команды даются указания, что и как нужно изменить, чтобы первый файл стал таким же, как второй.

Указания даются при помощи специальных символов:

Давайте рассмотрим несколько примеров использования команды diff.

Примеры использования команды diff

Чтобы выяснить, являются ли файлы одинаковыми, команда diff дополняется флагом -s . В нашем примере содержимое файлов fileA и sameAsfileA совпадает.

Скриншот консоли: команда diff испольузется с флагом -s

А в следующем примере файлы имеют разный контент. Вывод команды diff говорит, что строки 11 и 14 в showList_v2.js нужно изменить, чтобы они совпадали со строками 11 и 13 в showList_v1.js.


Параллельный просмотр различий в двух файлах, когда команда diff применяется с флагом -y


Вот еще несколько полезных флагов, которые можно применять с командой diff:

Синтаксис команды patch

Изменения в коде происходят постоянно. Расшаривать отредактированные файлы после внесения каждого изменения нереально. Обычно разработчики расшаривают сами изменения в коде.

Давайте посмотрим, как работают патчи:

Примеры использования команды patch

Предположим, у нас есть простой JavaScript-код в файле print_in_js.js, который выводит строку.


Наш коллега находит опечатку в строке № 3 и исправляет файл.

Когда файл исправлен и код работает корректно, наш коллега создает патч:

Давайте посмотрим содержимое патча:


Получив патч, мы применяем его:


Итоги

Создавать и применять патчи при помощи команд patch и diff довольно просто.

Похожий подход применяется, когда вы пользуетесь системами контроля версий вроде Git или SVN. Знание основ (т. е. работы соответствующих команд Linux) поможет вам лучше понять работу систем контроля версий, а это важно для разработчиков.

Иногда возникает необходимость сравнить несколько файлов между собой. Это может понадобиться при анализе разницы между несколькими версиями конфигурационного файла или просто для сравнения различных файлов. В Linux для этого есть несколько утилит, как для работы через терминал, так и в графическом интерфейсе.

В этой статье мы рассмотрим как выполняется сравнение файлов Linux. Разберем самые полезные способы, как для терминала, так и в графическом режиме. Сначала рассмотрим как выполнять сравнение файла linux с помощью утилиты diff.

Сравнение файлов diff

Утилита diff linux - это программа, которая работает в консольном режиме. Ее синтаксис очень прост. Вызовите утилиту, передайте нужные файлы, а также задайте опции, если это необходимо:

$ diff опции файл1 файл2

Можно передать больше двух файлов, если это нужно. Перед тем как перейти к примерам, давайте рассмотрим опции утилиты:

  • -q - выводить только отличия файлов;
  • -s - выводить только совпадающие части;
  • -с - выводить нужное количество строк после совпадений;
  • -u - выводить только нужное количество строк после отличий;
  • -y - выводить в две колонки;
  • -e - вывод в формате ed скрипта;
  • -n - вывод в формате RCS;
  • -a - сравнивать файлы как текстовые, даже если они не текстовые;
  • -t - заменить табуляции на пробелы в выводе;
  • -l - разделить на страницы и добавить поддержку листания;
  • -r - рекурсивное сравнение папок;
  • -i - игнорировать регистр;
  • -E - игнорировать изменения в табуляциях;
  • -Z - не учитывать пробелы в конце строки;
  • -b - не учитывать пробелы;
  • -B - не учитывать пустые строки.

Это были основные опции утилиты, теперь давайте рассмотрим как сравнить файлы Linux. В выводе утилиты кроме, непосредственно, отображения изменений, выводит строку в которой указывается в какой строчке и что было сделано. Для этого используются такие символы:

К тому же, линии, которые отличаются, будут обозначаться символом <, а те, которые совпадают - символом >.

Вот содержимое наших тестовых файлов:


Теперь давайте выполним сравнение файлов diff:

diff file1 file2


В результате мы получим строчку: 2,3c2,4. Она означает, что строки 2 и 3 были изменены. Вы можете использовать опции для игнорирования регистра:

diff -i file1 file2

Можно сделать вывод в две колонки:

diff -y file1 file2


А с помощью опции -u вы можете создать патч, который потом может быть наложен на такой же файл другим пользователем:

diff -u file1 file2


Чтобы обработать несколько файлов в папке удобно использовать опцию -r:


diff -u file1 file2 > file.patch


Как видите, все очень просто. Но не очень удобно. Более приятно использовать графические инструменты.

Сравнение файлов Linux с помощью GUI

Существует несколько отличных инструментов для сравнения файлов в linux в графическом интерфейсе. Вы без труда разберетесь как их использовать. Давайте рассмотрим несколько из них:

1. Kompare


Kompare - это графическая утилита для работы с diff, которая позволяет находить отличия в файлах, а также объединять их. Написана на Qt и рассчитана в первую очередь на KDE. Кроме сравнения файлов утилита поддерживает сравнение каталогов и позволяет создавать и применять патчи к файлам.

2. Meld


Это легкий инструмент для сравнения и объединения файлов. Он позволяет сравнивать файлы, каталоги, а также выполнять функции системы контроля версий. Программа создана для разработчиков и позволяет сравнивать до трёх файлов. Можно сравнивать каталоги и автоматически объединять сравниваемые файлы. Кроме того поддерживаются такие системы контроля версий, как Git.

3. Diffuse


Diffuse - еще один популярный и достаточно простой инструмент для сравнения и слияния файлов. Он написан на Python 2. Поэтому в современных версиях Ubuntu программу будет сложно установить. Поддерживается две основные возможности - сравнение файлов и управление версиями. Вы можете редактировать файлы прямо во время просмотра.

4. KDiff3


KDiff3 - еще один отличный, свободный инструмент для сравнения файлов в окружении рабочего стола KDE. Он входит в набор программ KDevelop и работает на всех платформах, включая Windows и MacOS. Можно выполнить сравнение до трех файлов Linux или даже сравнить каталоги. Кроме того, есть поддержка слияния и ручного выравнивания.

5. TkDiff


Это очень простая утилита для сравнения файлов написанная на основе библиотеки tk. Она позволяет сравнивать только два файла, поддерживает поиск и редактирование сравниваемых файлов.

Выводы

В этой статье мы рассмотрели как выполняется сравнение файлов linux с помощью терминала, как создавать патчи, а также сделали небольшой обзор лучших графических утилит для сравнения файлов. А какие инструменты для сравнения используете вы? Напишите в комментариях!


Погружение в diff

Команда diff сравнивает два файла и выдает список различий между ними. Чтобы быть более точным, он создает список изменений, которые необходимо внести в первый файл, чтобы он соответствовал второму файлу. Если вы будете иметь это в виду, вам будет легче понять вывод diff. Команда diff была разработана для поиска различий между файлами исходного кода и для вывода результатов, которые могут быть прочитаны и обработаны другими программами, такими как команда patch . В этом уроке мы рассмотрим наиболее полезные способы использования diff .

Мы можем сравнить файлы с этой командой. Введите diff, пробел, имя первого файла, пробел, имя второго файла и нажмите клавишу ВВОД.


  • c: Строка в первом файле должна быть изменена, чтобы соответствовать строке во втором файле.
  • d: строка в первом файле должна быть удалена, чтобы соответствовать второму файлу.
  • a: Дополнительный контент должен быть добавлен в первый файл, чтобы он соответствовал второму файлу.

4c4 в нашем примере говорит нам, что четвертая строка alpha1 должна быть изменена, чтобы соответствовать четвертой строке alpha2. Это первое различие между двумя найденными файлами.

Следующее изменение обозначено 12c12 . Применяя ту же логику, это говорит нам о том, что строка 12 в alpha1 содержит слово Lima, а строка 12 в alpha2 содержит слово Linux.

Третье изменение относится к строке, которая была удалена из alpha2. Метка 21d20 расшифровывается как «строка 21 должна быть удалена из первого файла, чтобы синхронизировать оба файла со строки 20 и далее». Строка < Uniform показывает нам содержимое строки, которую необходимо удалить из alpha1.

Четвертое отличие обозначено 26a26,28 . Это изменение относится к трем дополнительным строкам, которые были добавлены в alpha2. Обратите внимание на 26,28 на этикетке. Номера в две строки, разделенные запятой, представляют собой диапазон номеров строк. В этом примере диапазон составляет от строки 26 до строки 28. Метка интерпретируется как «в строке 26 в первом файле добавьте строки 26–28 из второго файла». Нам показаны три строки в alpha2, которые необходимо быть добавленным к альфа1. Они содержат слова Quirk, Strange и Charm.

Snappy One-Liners

Если вам нужно знать, являются ли два файла одинаковыми, используйте параметр -s (сообщать об идентичных файлах).


Вы можете использовать опцию -q (краткая), чтобы получить одинаково лаконичное утверждение о двух разных файлах.


Следует обратить внимание на то, что с двумя одинаковыми файлами опция -q (краткая) полностью закрывается и ничего не сообщает.

Альтернативный взгляд

Опция -y (рядом) использует другую компоновку для описания различий в файлах. Часто удобно использовать параметр -W (ширина) с видом рядом, чтобы ограничить количество отображаемых столбцов. Это позволяет избежать появления уродливых строк, которые затрудняют чтение. Здесь мы указали diff производить параллельное отображение и ограничивать вывод до 70 столбцов.


Первый файл в командной строке, alpha1, показан слева, а вторая строка в командной строке, alpha2, показана справа. Строки из каждого файла отображаются рядом. Рядом с этими строками в alpha2 есть символы индикатора, которые были изменены, удалены или добавлены.

  • |: Строка, которая была изменена во втором файле.
  • <: Строка, которая была удалена из второго файла.
  • >: Строка, добавленная ко второму файлу, которого нет в первом файле.

Если вы предпочитаете более компактную сводную информацию о различиях в файлах, используйте параметр --suppress-common-lines . Это заставляет diff перечислять только измененные, добавленные или удаленные строки.


Добавьте цветовую подсветку

Другая утилита под названием colordiff добавляет цветовую подсветку к выводу diff. Это позволяет намного легче увидеть, какие линии имеют различия.

Используйте apt-get для установки этого пакета в вашу систему, если вы используете Ubuntu или другой дистрибутив на основе Debian. В других дистрибутивах Linux используйте инструмент управления пакетами вашего дистрибутива Linux.

Используйте colordiff же, как вы используете diff .



Предоставление определённого контекста

Первый метод использует опцию -c (скопированный контекст).


Вывод diff имеет заголовок. В заголовке перечислены два имени файла и время их изменения. Звездочки (*) перед именем первого файла и тире (-) перед именем второго файла. Звездочки и тире будут использоваться, чтобы указать, какому файлу принадлежат строки в выходных данных.

Линия звездочек с 1,7 в середине указывает на то, что мы смотрим на линии от alpha1. Чтобы быть точным, мы смотрим на строки с первой по седьмую. Слово Delta помечается как измененное. Он имеет восклицательный знак (!) Рядом с ним, и он красный. Есть три строки не измененного текста, отображаемые до и после этой строки, поэтому мы можем видеть контекст этой строки в файле.

Линия штрихов с 1,7 в середине говорит о том, что мы сейчас смотрим на линии из alpha2. Опять же, мы смотрим на строки с первой по седьмую, причем слово Dave на четвертой строке помечено как отличающееся.


Вторая опция diff которая предлагает контекст, это опция -u (унифицированный контекст).


Как и раньше, у нас есть заголовок на выходе. Эти два файла названы, и показано время их изменения. Есть тире (-) перед названием альфа1 и знаки плюс (+) перед названием альфа2. Это говорит нам о том, что тире будут использоваться для обозначения альфа1, а знаки плюс будут использоваться для обозначения альфа2. По всему списку разбросаны строки, начинающиеся со знаков (@). Эти строки отмечают начало каждого различия. Они также говорят нам, какие строки показываются из каждого файла.

Нам показывают три строки до и после строки, помеченной как отличающиеся, чтобы мы могли видеть контекст измененной строки. В едином представлении линии с разницей показаны одна над другой. Перед строкой из alpha1 стоит тире, а перед строкой из alpha2 стоит знак плюс. Это отображение достигает в восьми строках того, что для скопированного контекстного дисплея выше потребовалось пятнадцать.

Как и следовало ожидать, мы можем попросить diff точное количество строк унифицированного контекста, которые мы хотели бы видеть. Для этого используйте опцию -U (унифицированный контекст) с заглавной буквой «U» и укажите желаемое количество строк:


Игнорирование пустого пространства

Давайте проанализируем еще два файла, test4 и test5. В них есть имена шести супергероев.


Результаты показывают, что diff находит ничего особенного с линиями Black Widow, Spider-Man и Thor. Он отмечает изменения с линиями Капитан Америка, Железный человек и Халк.

Если они не имеют значения для вас, вы можете diff игнорировать определенные типы различий строк, в том числе:

  • -i: игнорировать различия в случае.
  • -Z: игнорировать конечные пробелы.
  • -b: игнорировать изменения количества пустого пространства.
  • -w: игнорировать все изменения пробелов.

Давайте попросим diff снова проверить эти два файла, но на этот раз, чтобы игнорировать любые различия в случае.


Строки с «The Hulk» и «The Hulk» теперь считаются совпадением, и для строчной буквы «h» не отмечается никакой разницы. Давайте попросим diff также игнорировать конечный пробел.


Как и предполагалось, конечный пробел должен был быть различием на линии Ironman, потому что diff больше не помечает разницу для этой линии. Это оставляет Капитана Америку. Давайте попросим diff игнорировать регистр и игнорировать все проблемы с пробелами.


Указав diff игнорировать различия, которые нас не интересуют, diff сообщает нам, что для наших целей файлы совпадают.

Команда diff имеет много других опций, но большинство из них относится к созданию машиночитаемого вывода. Их можно просмотреть на странице руководства Linux. Параметры, которые мы использовали в приведенных выше примерах, позволят вам отследить все различия между версиями ваших текстовых файлов, используя командную строку и человеческие глаза.

Читайте также: