Сравнение файлов в Linux для веб-разработчика. Как сравнить файлы по содержимому в Windows или Linux? Linux сравнение файлов по содержимому

Обычно diff генерирует вывод следующего формата:

$ diff file1 file2 2c2 < Helllo --- > Hello

Но существует специальный параметр командной строки (-y), который сообщает утилите о необходимости вывода данных в двух отдельных столбцах. А это пример такого вывода:

$ diff -y file1 file2 Hi Hi Helllo | Hello Bye Bye

Очевидно, что при использовании данного формата вывода символ "|" используется для маркировки отличающихся строк.

5. Сокрытие идентичных строк

Если вы внимательно рассмотрите вывод из предыдущего примера (из расположенного выше раздела 4), вы обнаружите, что при использовании параметра командной строки -y утилита diff выводит не только измененные, но и идентичные строки обрабатываемых файлов. В том случае, если вам нужно убрать идентичные строки из вывода, вы можете воспользоваться параметром --suppress-common-lines .

$ diff -y --suppress-common-lines file1 file2 Helllo | Hello

6. Вывод имен функций языка C, содержащих измененный код

При использовании утилиты diff для сравнения двух файлов исходного кода на языке C может использоваться специальный параметр (-p), который сообщает утилите о необходимости вывода имен функций, в коде которых были обнаружены изменения. Например, предположим, что требуется сравнить два следующих файла исходного кода на языке C:

Файл с именем file1.c:

#include void compare(float x, float y) { if(x == y) // некорректный способ сравнения { printf("\n РАВНЫ \n"); } } int main(void) { compare(1.234, 1.56789); return 0; }

Файл с именем file2:

#include void compare(float x, float y) { if(x == y) { printf("\n РАВНЫ \n"); } } int main(void) { compare(1.234, 1.56789); return 0; }

Это результат обычного сравнения этих файлов:

$ diff file1.c file2.c 5c5 < if(x == y) // некорректный способ сравнения --- > if(x == y)

А это результат сравнения тех же файлов с использованием параметра -p:

$ diff -p file1.c file2.c *** file1.c 2016-12-29 11:45:36.587010816 +0530 --- file2.c 2016-12-29 11:46:39.823013274 +0530 *************** *** 2,8 **** void compare(float x, float y) { ! if(x == y) // некорректный способ сравнения { printf("\n РАВНЫ \n"); } --- 2,8 ---- void compare(float x, float y) { ! if(x == y) { printf("\n РАВНЫ \n"); }

Очевидно, что в случае использования параметра командной строки -p diff генерирует более подробный вывод с маркировкой измененных строк с помощью символа восклицательного знака ("!").

7. Рекурсивное сравнение содержимого поддиректорий

Утилита diff также позволяет осуществлять рекурсивное сравнение содержимого поддиректорий, но этот режим работы не активирован по умолчанию. Я подразумевал, что при использовании данной команды:

$ diff diff-files/ second-diff-files/ diff diff-files/file1 second-diff-files/file1 1c1 < Hi --- > i diff diff-files/file2 second-diff-files/file2 2c2 < Hello --- > ello

утилита diff будет осуществлять сравнение лишь файлов из директорий верхнего уровня, но в случае использования параметра -r (активирующего режим рекурсивного сравнения файлов) будет осуществляться сравнение даже тех файлов, которые находятся в поддиректориях:

$ diff -r diff-files/ second-diff-files/ diff -r diff-files/file1 second-diff-files/file1 1c1 < Hi --- > i diff -r diff-files/file2 second-diff-files/file2 2c2 < Hello --- > ello diff -r diff-files/more-diff-files/file1 second-diff-files/more-diff-files/file1 1c1 < Hi --- > i diff -r diff-files/more-diff-files/file2 second-diff-files/more-diff-files/file2 2c2 < Hello --- > ello

8. Обработка отсутствующих файлов как пустых

Утилита diff также поддерживает параметр, с помощью которого вы можете сообщить ей о том, что следует рассматривать отсутствующие файлы как пустые. Если вы сравните файлы с именами file1 и file3 (причем последнего файла не существует), по умолчанию diff выведет сообщение об ошибке:

$ diff file1 file3 diff: file3: Нет такого файла или каталога

В этом нет ничего плохого; по сути, данное поведение является вполне обоснованным. Но бывают случаи, когда необходимо избежать вывода сообщений об ошибках (возможно, при использовании diff в рамках сценариев командной оболочки), в которых вы можете воспользоваться параметром -N для обработки отсутствующих файлов как пустых и продолжения сравнения файлов.

$ diff -N file1 file3 1,5d0 < Hi < < Helllo < < Bye

Заключение

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

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

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

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

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

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

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

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

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

  • a - добавлена;
  • d - удалена;
  • c - изменена.

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

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

Теперь давайте выполним сравнение файлов 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 ~/tmp1 ~/tmp2

Для удобства, вы можете перенаправить вывод утилиты сразу в файл:

diff -u file1 file2 > file.patch

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

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

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

1. Kompare

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

  • Поддержка нескольких форматов diff;
  • Поддержка сравнение файла linux и каталогов;
  • Поддержка просмотра файлов diff;
  • Настраиваемый интерфейс;
  • Создание и применение патчей к файлам.

2. DiffMerge

DiffMerge - это кроссплатформенная программ для сравнения и объединения файлов. Позволяет сравнивать два или три файла. Поддерживается редактирование строк на лету.

Особенности:

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

3. Meld

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

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

4. Diffuse

Diffuse - еще один популярный и достаточно простой инструмент для сравнения и слияния файлов. Он написан на Python. Поддерживается две основные возможности - сравнение файлов и управление версиями. Вы можете редактировать файлы прямо во время просмотра. Основные функции:

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

5. XXdiff

XXdiff - это свободный и очень мощный инструмент для сравнения и слияния файлов. Но у программы есть несколько минусов. Это отсутствие поддержки Unicode и редактирования файлов.

Особенности:

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

6. KDiff3

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

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

Выводы

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

Из-под какой бы системы мне не приходилось возиться с кодом, рано или поздно становится чересчур накладно сравнивать разные версии исходников. Здесь указаны легкие бесплатные утилитки для поиска различий в файлах под Linux, Windows и Mac. Общий формат запуска – file1 file2.

Под Windows с задачей сравнения содержимого файлов (да и каталогов, что порой не бесполезно) прекрасно справляется – WinMerge . Легкая. Не завязана ни на какие IDE. Писана на Qt и кроссплатформенна – должна запускаться и на никсах. Кроме файлов умеет сравнивать и содержимое директорий (в том числе на основе масок-регэкспов). Можно навешать дополнительных плагинов.

WinMerge – кросс-платформенная утилита для сравнения файлов и не только

Mac – opendiff. Представляет собой отдельный компонент XCode. Вполне себе запускается standalone из командной строчки. Различия подсвечивает бледно-серым, зато умеет кстати показывать стрелочками что куда добавилось. Может выполнять слияние (ключик -merge). Если кроме сравниваемых файлов, указать после ключа -ancestor общий файл-предок то сравнение будет производиться с ним. Умеет сравнивать папки.

утилита opendiff – бесплатное средство сравнения файлов на системе Mac

Linux – . Есть на всех платформах (Windows, Mac, Linux) за счет того что так-же написан на Qt. Умеет сравнивать до трех файлов или директорий. Поддерживает возможность слияние изменений, с поддержкой редактирования для ручного разрешения конфликтов.

Утилита kdiff3 – сравнение двух файлов

UPDATE 18.10.2013

Если в никсах вы работаете в Gnom’е то прекрасный выбор – meld . Интеграция с популярными системами контроля версий (Git, Subversion, и др.), инструменты для слияния – авто-слияние, редактирование с подхватыванием текущих различий “на лету”, подсветка синтаксиса. Есть порты для OS X Windows.

Ну а на крайняк (если ничего стороннего поставить нельзя) – на помощь приходит неказистый diff из под командной строки (предустановлен на nix-like-системах включая и Маки, и Солярисы). Гибкий. Можно долго и с упоением играться с настройками, чтобы получить возможность отображения различий на основе маски (-F), получать сравнение в привычных двух колонках (ключик –side-by-side) и т.п. Для объемных незнакомых файлов предпочитаю вывод в “контекстном” формате, когда отображаются не только измененные строчки, но и соседние с ними.

Для сравнивания более чем двух файлов может подойти diff3.

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

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

Под катом Вы также найдете примеры настроек Git для использования с DiffMerge и WinMerge под Windows. Думаю многим сэкономит время.

Название Особенности Платформа

KDiff3

Git и WinMerge

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

Diff_cmd () { "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \ "$LOCAL" "$REMOTE" >/dev/null 2>&1 } merge_cmd () { "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \ "$PWD/$LOCAL" "$PWD/$REMOTE" "$PWD/$MERGED" >/dev/null 2>&1 status=$? }
Когда Git не может автоматически объединить изменения, происходит конфликт слияния и в конфликтующий файл добавляются маркеры слияния (<<<<<<<, =======, и >>>>>>>). Они необходимы для разрешения конфликта с помощью сторонних инструментов.
Рассмотрим файл readme.txt который образуется в результате выполнения слияния веток master и new в приведенном выше примере:

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

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

Исходя из описанной логики перепишем команду слияния merge_cmd следующим образом:
merge_cmd () { "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \ "$MERGED" >/dev/null 2>&1 status=$? }
По сути, оба приведенных варианта эквивалентны.

2) Отредактируем .gitconfig
tool = winmerge cmd = "winmerge" tool = winmerge cmd = "winmerge" trustExitCode = false keepBackup = false
последняя строчка отменяет сохранение backup-файлов в директории репозитория.

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

Для разрешения конфликта при слиянии веток, воспользуемся командой
git mergetool

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

    • a - добавлена;
    • d - удалена;
    • c - изменена.

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

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

    Теперь давайте выполним сравнение файлов 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 ~/tmp1 ~/tmp2

    Для удобства, вы можете перенаправить вывод утилиты сразу в файл:
    $ diff -u file1 file2 > file.patch

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

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

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

    1. Kompare

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

  • Поддержка нескольких форматов diff;
  • Поддержка сравнение файла linux и каталогов;
  • Поддержка просмотра файлов diff;
  • Настраиваемый интерфейс;
  • Создание и применение патчей к файлам.

2. DiffMerge

DiffMerge - это кроссплатформенная программ для сравнения и объединения файлов. Позволяет сравнивать два или три файла. Поддерживается редактирование строк на лету.

Особенности:

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

3. Meld

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

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

4. Diffuse

Diffuse - еще один популярный и достаточно простой инструмент для сравнения и слияния файлов. Он написан на Python. Поддерживается две основные возможности - сравнение файлов и управление версиями. Вы можете редактировать файлы прямо во время просмотра. Основные функции:

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

5. XXdiff

XXdiff - это свободный и очень мощный инструмент для сравнения и слияния файлов. Но у программы есть несколько минусов. Это отсутствие поддержки Unicode и редактирования файлов.

Особенности:

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

6. KDiff3

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

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