Kdiff3 как пользоваться в линукс

Обновлено: 07.07.2024

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

Базовый синтаксис команды выглядит следующим образом:

Утилита поддерживает ряд параметров, большая часть которых позволяет генерировать сценарии для объединения файлов с помощью утилиты ed. В частности, для генерации таких файлов чаще всего используется параметр -x, позволяющий добавить отличия между всеми файлами в файл1. Также существует аналогичный параметр -e, позволяющий добавить отличия между файлами файл2 и файл3 в файл1, что требуется крайне редко. Параметр -3 позволяет создать сценарий для добавления отличий между файлами файл1 и файл3 в файл файл1, что также может понадобиться в редких случаях. Параметр -i позволяет добавить в сценарий команды для автоматического завершения работы утилиты ed. Параметр -b позволяет игнорировать различия пустых строк, то есть, пропускать все находящиеся в них пробелы и символы табуляции.

При обычном использовании в выводе утилиты могут использоваться следующие служебные метки:

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

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

Сравнение трех файлов

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

Это содержимое файла sample1.txt:

It is a truth universally acknowledged, that a single man in possession
of a good fortune, must be in want of a wife.

However little known the feelings or views of such a man may be on his
first entering a neighbourhood, this truth is so well fixed in the minds
of the surrounding families, that he is considered the rightful property
of some one or other of their daughters.

Это — содержимое файла sample2.txt:

However little known the feelings or views of such a man may be on his
first entering a neighbourhood, this truth is so well fixed in the minds
of the surrounding families, that he is considered the rightful property
of some one or other of their daughters.

"My dear Mr. Bennet," said his lady to him one day, "have you heard that
Netherfield Park is let at last?"

Mr. Bennet replied that he had not.

А это — содержимое файла sample3.txt:

However little known the feelings or views of such a man may be on his
first entering a neighbourhood, this truth is so well fixed in the minds
of the surrounding families, that he is considered the rightful property
of some one or other of their daughters.

"My dear Mr. Bennet," said his lady to him one day, "have you heard that
Netherfield Park is let at last?"

Для сравнения трех текстовых файлов достаточно вызвать утилиту diff3 без каких-либо параметров:

В результате будет получен следующий вывод, представляющий собой описание различий содержимого этих файлов:

====1
1:1,3c
It is a truth universally acknowledged, that a single man in possession
of a good fortune, must be in want of a wife.

2:0a
3:0a
====
1:7a
2:5,9c

"My dear Mr. Bennet," said his lady to him one day, "have you heard that
Netherfield Park is let at last?"

Mr. Bennet replied that he had not.
3:5,7c

"My dear Mr. Bennet," said his lady to him one day, "have you heard that
Netherfield Park is let at last?"

Несложно заметить, что вывод в данном формате плохо читается, так как предназначен для программной обработки. Итак, для объединения файлов в первую очередь следует открыть первый файл sample1.txt (====1) и добавить с первой по третью строки включительно из из этого файла (1:1,3c) в начало второго и третьего файлов sample2.txt (2:0a) и sample3.txt (3:0a) соответственно. После этого следует изменить строки с 5 по 9 включительно второго файла sample2.txt (2:5,9c) и строки с 5 по 7 включительно третьего файла sample3.txt (3:5,7c), удалив их для приведения этих файлов в соответствие с первым файлом sample1.txt.

Создание сценария для утилиты ed

Для того, чтобы создать сценарий преобразования файлов, совместимый с утилитой ed, следует воспользоваться параметром -e. Также можно использовать параметр -i для добавления в сценарий инструкций для автоматического завершения работы утилиты. Также разумным решением будет сохранение сценария в отдельном файле с именем sample.ed:

В результате будет сгенерирован файл сценария утилиты ed под названием sample.ed со следующим содержимым:

"My dear Mr. Bennet," said his lady to him one day, "have you heard that
Netherfield Park is let at last?"
.
w
q

Теперь может быть исполнена следующая команда:

В итоге файл sample1.txt примет следующий вид:

It is a truth universally acknowledged, that a single man in possession
of a good fortune, must be in want of a wife.

However little known the feelings or views of such a man may be on his
first entering a neighbourhood, this truth is so well fixed in the minds
of the surrounding families, that he is considered the rightful property
of some one or other of their daughters.

"My dear Mr. Bennet," said his lady to him one day, "have you heard that
Netherfield Park is let at last?"

Очевидно, что силами созданного сценария в оригинальный файл sample1.txt были добавлены строки, встречающиеся во втором и третьем файле, а именно sample2.txt и sample3.txt. Да, утилита работает по-разному при наличии и отсутствии параметров и это нужно учитывать.

Иногда возникает необходимость сравнить несколько файлов между собой. Это может понадобиться при анализе разницы между несколькими версиями конфигурационного файла или просто для сравнения различных файлов. В 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 с помощью терминала, как создавать патчи, а также сделали небольшой обзор лучших графических утилит для сравнения файлов. А какие инструменты для сравнения используете вы? Напишите в комментариях!

На хабре уже было много статей о распределенных системах управления версиями (DVCS), их сравнений, а также сравнений GUI-клиентов для них. Также были обсуждения плагинов к IDE для работы с git и mercurial. Но практически не было информации об инструментах визуального сравнения и разрешения конфликтов слияния.

diff and merge


Недавно я «перескочил» с mercurial (который до сих пор считаю более удобным и логичным) на git, потому что, подавляющее большинство проектов, которые мне интересны, используют git и хостятся на github. В связи с этим, встал вопрос о пересмотре арсенала инструментов, в частности вопрос выбора инструмента визуального сравнения и слияния (diff and merge). Дабы восполнить недостаток информации на хабре, я решил написать этот мини-обзор. Как говориться — по горячим следам.

KDiff3

  • бесплатен;
  • поддерживает трехстороннее слияние;
  • умеет сравнивать директории;
  • с различными кодировками работает нормально;
  • без дополнений не подсвечивает синтаксис.

DiffMerge

  • бесплатен;
  • поддерживает трехстороннее слияние;
  • умеет сравнивать директории.
  • бывают проблемы при работе с кириллицей. Думаю, со временем, исправят.
  • DiffMerge по умолчанию, не поддерживает подсветку синтаксиса языков программирования.

WinMerge

  • Open Source;
  • никаких проблем с кодировками;
  • подсветка синтаксиса без лишних телодвижений;
  • сравнение директорий.
  • инструмент слияния является двусторонним, что может создавать неудобства в некоторых случаях;
  • Windows only.
  • GPL v2;
  • двустороннее и трехстороннее слияние файлов;
  • сравнение директорий;
  • подсветка синтаксиса (при установленном GtkSourceView).
  • для установки под Windows требуется установить Python, GTK+, Glib, GtkSourceView, что не каждому понравиться.

Diffuse

  • GPL;
  • поддержка 2-way, 3-way и n-way (произвольное количество файлов) слияния;
  • подсветка синтаксиса;
  • отлично работает с UTF-8;
  • неограниченная глубина отмен (Undo);
  • удобная навигация по коду.
  • разве что, невозможность сравнивать директории.

TKDiff

  • GPLv2;
  • можно добавлять закладки для различий;
  • с кодировками работает нормально;
  • интерфейс менее удобен и выглядит очень бедно (см. скриншот), чем у других продуктов.
  • нет подсветки синтаксиса;
  • не умеет сравнивать директории.

SmartSynchronize

  • трехстороннее слияние;
  • нет проблем с кодировками;
  • помимо файлов, может сравнивать директории.
  • для коммерческого использования требуется лицензия;
  • подсветка синтаксиса для языков программирования по умолчанию не предусмотрена. Не исключено, что можно как-то сделать.

BeyondCompare

  • трехстороннее слияние;
  • может сравнивать файлы, директории, удаленные директории, архивы, а также MP3-файлы, изображения и др. Но последние пункты — это в принципе не нужный функционал.
  • ShareWare;
  • нет версии под Mac.

Araxis Merge

  • трехстороннее слияние;
  • нет проблем с кодировками;
  • подсвечивает синтаксис;
  • помимо файлов, может сравнивать директории и синхронизировать их;
  • хорошо работает на сравнении больших файлов (гигабайты) и больших директорий;
  • генерация отчётов по результатам сравнения. (если это можно назвать плюсом).
  • ShareWare;
  • нет версии под Linux.

Git и DiffMerge

1) Добавим в директорию c:/Git/libexec/git-core/mergetools/
файл diffmerge следующего содержания:


2) Теперь добавим в файл c:/Users/swipe/.gitconfig
следующие строки:


3) Создадим конфликт и вызовем DiffMerge для его разрешения


tree


diff


conflict


merge

Git и WinMerge

1) Добавим в директорию c:/Git/libexec/git-core/mergetools/
файл winmerge следующего содержания:


Когда Git не может автоматически объединить изменения, происходит конфликт слияния и в конфликтующий файл добавляются маркеры слияния (<<<<<<<, =======, и >>>>>>>). Они необходимы для разрешения конфликта с помощью сторонних инструментов.
Рассмотрим файл readme.txt который образуется в результате выполнения слияния веток master и new в приведенном выше примере:


Мы можем открыть файл конфликтов с помощью программы WinMerge для разрешения конфликта.

open

После этого откроется средство двухстороннего слияния:

winmerge

Исходя из описанной логики перепишем команду слияния merge_cmd следующим образом:

По сути, оба приведенных варианта эквивалентны.

2) Отредактируем .gitconfig

последняя строчка отменяет сохранение backup-файлов в директории репозитория.

3) Создадим конфликт при слиянии двух веток (см. пример с использованием DiffMerge).

Иногда возникает необходимость сравнить несколько файлов между собой. Это может понадобиться при анализе разницы между несколькими версиями конфигурационного файла или просто для сравнения различных файлов. В 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


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

  • ==== : это означает, что все файлы разные.
  • ==== 1 : файл 1 отличается.
  • ==== 2 : Файл 2 отличается.
  • ==== 3 : Файл 3 отличается.

Синтаксис:

Пример. Рассмотрим три файла: a.txt , b.txt и c.txt .


Теперь, если команда diff3 используется над этими тремя файлами, то получится следующий вывод:


Параметры:

    «c» означает изменение, а «a» означает добавление: «c» означает «изменение», необходимое в строках / тексте. Если появляется алфавит «а», это означает, что необходимо добавить строку.

Пример:


Теперь, если команда diff3 используется над этими тремя файлами:


Приведенный выше вывод означает, что изменение в file3 (т.е. c.txt ) необходимо добавить в file1 ( a.txt ) и file2 ( b.txt ), чтобы все три файла были похожи. Кроме того, можно изменить вторую строку в b.txt (c), чтобы сделать все три файла похожими.

Пример:


Применить diff3 -x


Пример:


Применить diff3 -X


Пример:


Применить diff3 -e


Итак, мы видим, что выходные данные показывают не объединенные изменения.

Пример:


Применить diff3 -E


Пример:


Применяя diff3 -m


Таким образом, вышеприведенный вывод показывает содержимое объединенного файла, который объединяет содержимое всех трех файлов, представленных в качестве аргументов для diff3 .

Пример:



Как мы видим, когда команда была запущена выше, содержимое третьего файла передавалось через stdin. Обратите внимание, что после ввода содержимого файла из stdin необходимо нажать комбинацию клавиш ctrl + d, чтобы получить вывод diff3.

Пример:


Таким образом, приведенный выше вывод показывает, что diff3 пытался сравнить даже файл odt, рассматривая его как текстовый файл.

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