Команда diff linux описание

Сравнение файлов в Linux – утилита diff

Очень часто возникают ситуации, когда необходимо сравнить содержимое двух или нескольких текстовых файлов. Например, для системных администраторов важно знать о конкретных различиях в конфигурации обслуживаемых систем. Программистам и разработчикам не менее важно быстро выявить различия в коде проектов, а также быстро создать патч, отражающий соответствующие изменения между двумя файлами или разными версиями одного. Это лишь самый распространённый перечень ситуаций, когда использование специализированных утилит для сравнения содержимого файлов приходится очень кстати и экономит кучу времени. Одной из таких утилит в системах Linux является diff – о ней и пойдёт речь в данной статье.

Основные возможности утилиты diff

Главное и, наверное, самое ценное преимущество diff в том, что эта утилита прекрасно работает через интерфейс командной строки. Вот почему она довольно популярна среди системных администраторов. Однако, это обстоятельство вполне закономерно объясняет и имеющийся у diff недостаток — работа с ней недостаточно наглядна, а для новичков довольно сложна.

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

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

Синтаксис команды diff и её основные опции

Правила использования утилиты diff задаются командой, имеющей следующий синтаксис:

Здесь в качестве [FILES] задаются через пробел имена файлов для сравнения. [OPTION] определяет опции работы команды, основные из которых приведены в следующей таблице:

Опция Значение
-q, —brief Выводит только различия файлов.
-s Выводит различия только при полном совпадении файлов.
-c, -C Выводит количество совпадающих строк.
-u, -U Выводит количество отличающихся строк.
-y, —side-by-side Выводит содержимое в столбцах для сравнения «бок о бок».
-l, —paginate Постраничный вывод с поддержкой перелистывания.
-r, —recursive Рекурсивное сравнение всех файлов в подкаталогах.
-i, —ignore-case Игнорировать регистр символов.
-b, —ignore-space-change Игнорировать изменения в изменении пробелов.
-w, —ignore-all-space Игнорировать все пробелы.
-B, —ignore-blank-lines Игнорировать пустые строки.
-Z, —ignore-trailing-space Игнорировать пробелы в конце строк.

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

  • a – добавление строки;
  • d – удаление строки;
  • c – изменение строки.

Вывод, например, может быть таким:

Здесь запись «2c2» означает, что вторая строка в файле №1 (оригинал) отличается от соответствующей (второй) строки в файле №2. Символ « » — файлу №2. Запись «—» чисто косметическая и предназначена для визуальной удобочитаемости результатов. Для наглядности, данный вывод соответствует результату сравнения двух файлов (file1 и file2) со следующим содержимым:

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

Теперь, для более наглядной демонстрации работы утилиты diff можно несколько усложнить условия задачи из предыдущей главы, изменив файл №2 следующим образом:

Тогда, выполнив команду

будет получен следующий вывод:

Здесь выражение «2c2,3» говорит о том, что второй строке (line2) в файле file1 соответствуют изменения в file2 в виде строк «line11» и «line22». Запись «2,3» означает диапазон строк в file2, содержащих изменения относительно строки №2 в file1. Запись «3c5,6» говорит о том, что после строки №3 оригинального файла в его изменённой версии (file2) были добавлены строки № 5 и №6, т. е. «line4» и «line5».

Создание патчей (заплаток) с помощью утилиты diff

Одной из особенностей diff является использование опции «-u» для создания патчей. Которые могут быть использованы для приведения содержимого файла к актуальному состоянию. Это очень удобно, ведь все инструкции для актуализации содержатся в одном файле-патче, который может быть обработан автоматически с помощью специализированной утилиты, например patch. Вывод для примера из предыдущей главы с использованием опции «-u» будет следующим:

Заключение

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Сравнение файлов в консоли Linux

Нужно увидеть различия между двумя ревизиями текстового файла? Тогда diff — это команда, которая вам нужна. Из этого туториала вы узнаете, как легко использовать diff в Linux и macOS.

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

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

Давайте углубимся и проанализируем два файла. Порядок файлов в командной строке определяет, какой файл diff считает «первым файлом», а какой — «вторым файлом». В приведенном ниже примере alpha1 — это первый файл, а alpha2 — второй файл. Оба файла содержат фонетический алфавит, но второй файл, alpha2, подвергся некоторому дальнейшему редактированию, так что эти два файла не идентичны.

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

Как мы анализируем этот результат? Если вы знаете, что искать, это не так уж плохо. Каждое различие перечисляется по очереди в одном столбце, и каждое различие помечается. Ярлык содержит цифры по обе стороны от буквы, например 4c4. Первое число — это номер строки в alpha1, а второе — номер строки в alpha2. Буква в середине может быть:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

На самом деле, colordiff — это оболочка для diff, и diff делает всю работу за кулисами. Из-за этого все опции diff будут работать с colordiff.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Так что же отличается? Что ж, в тесте 5 Халк пишется строчной буквой «h», а у «Капитана Америка» есть дополнительный пробел между «Капитаном» и «Америкой». Хорошо, это ясно, но что не так с линией Ironman? Там нет видимых различий. Вот хорошее эмпирическое правило. Если вы не видите этого, ответ — пробел. В конце этой строки почти наверняка есть пробел или два, или символ табуляции.

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

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

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

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

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

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

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

Источник

Читайте также:  25 августа день рождения операционной системы linux
Оцените статью