Linux diff сравнение каталогов

Содержание
  1. Команда Diff в Linux
  2. Как использовать команду diff
  3. Нормальный формат
  4. Формат контекста
  5. Единый формат
  6. Игнорировать регистр
  7. Выводы
  8. Команда diff в Linux: сравниваем два файла
  9. Что из себя представляет команда diff в Linux?
  10. Синтаксис команды diff
  11. Примеры использования команды diff
  12. Синтаксис команды patch
  13. Примеры использования команды patch
  14. Итоги
  15. Сравнение файлов в Linux (команда diff)
  16. Синтаксис команды diff
  17. Опции команды diff
  18. Примеры использования команды diff
  19. Сравнение двух текстовых файлов
  20. Сравнение директорий, содержащих текстовые файлы
  21. Заключение
  22. HuMan: diff
  23. Команда diff без опций
  24. Опция -с: Контекстный формат
  25. Опция —u: Унифицированный формат
  26. Опция -y или —side-by-side (бок-о-бок) Сравнительный формат
  27. —left-column (левая колонка)
  28. —suppress-common-lines
  29. Опция -e или —ed
  30. Опция -f или —forward-ed (прямой ed)
  31. Опция -n или —rcs
  32. Опция -D NAME
  33. Сравнение каталогов
  34. Опция -s или —report-identical-files
  35. Опция -r или —recursive
  36. Опция -N или —new-file
  37. Опция -P или —unidirectional-new-file
  38. Опция -x ОБРАЗЕЦ или —exclude=ОБРАЗЕЦ
  39. Опция -S ИМЯ_ФАЙЛА или —starting-file=ИМЯ_ФАЙЛА
  40. Форматирование вывода команды diff
  41. Опция -t или —expand-tabs
  42. Опция -T или —initial-tab
  43. Опция -l или —paginate
  44. Регулировка производительности команды diff
  45. Опция -d или —minimal
  46. Опция -H или —speed-large-files
  47. Опция —horizon-lines=ЧИСЛО_СТРОК
  48. Сравнение трех файлов: Команда diff3
  49. Интерактивное объединение файлов при помощи команды sdiff
  50. Правка файлов при помощи команды patch
  51. Все опции команды diff

Команда Diff в Linux

diff — это утилита командной строки, которая позволяет сравнивать два файла построчно. Он также может сравнивать содержимое каталогов.

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

Как использовать команду diff

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

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

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

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

Нормальный формат

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

Результат будет выглядеть примерно так:

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

0a1 , 2d2 и 4c4,5 — это команды изменения. Каждая команда изменения содержит следующее слева направо:

  • Номер строки или диапазон строк в первом файле.
  • Особый символ изменения.
  • Номер строки или диапазон строк во втором файле.

Символ изменения может быть одним из следующих:

  • a — Добавьте линии.
  • c — Измените линии.
  • d — Удалить строки.

За командой изменения следуют полные строки, которые удаляются ( ) и добавляются в файл ( > ).

  • 0a1 — добавить строку 1 второго файла в начало file1 (после строки 0 ).
    • > Kubuntu — Строка из второй строки, которая добавляется в первый файл, как описано выше.
  • 2d2 — Удалить строку 2 в первом файле. 2 после символа d означает, что если строку не удалить, она появится на строке 2 второго файла.
    • — удаленная строка.
  • 4c4,5 — Заменить (изменить) строку 5 в первом файле на строки 4-5 из второго файла.
    • — строка в первом заменяемом файле.
    • — — Разделитель.
    • > Arch Linux и > Centos — Строки из второго файла, заменяющие строку в первом файле.

Формат контекста

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

Параметр -c указывает diff выводить вывод в контекстном формате:

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

  • from-file-line-numbers и to-file-line-numbers — Номера строк или разделенный запятыми диапазон строк в первом и втором файле, соответственно.
  • from-file-line и to-file-line — Строки, которые различаются, и строки контекста:
    • Строки, начинающиеся с двух пробелов, являются строками контекста, одинаковыми в обоих файлах.
    • Строки, начинающиеся со знака минуса ( — ), — это строки, которые ничего не соответствуют во втором файле. Во втором файле отсутствуют строки.
    • Строки, начинающиеся с символа плюса ( + ), — это строки, которые ничего не соответствуют в первом файле. В первом файле отсутствуют строки.
    • Строки, начинающиеся с восклицательного знака ( ! ), — это строки, которые меняются между двумя файлами. Каждая группа строк, начинающаяся с ! из первого файла имеет соответствующее совпадение во втором файле.

Давайте объясним наиболее важные части вывода:

  • В этом примере у нас есть только один раздел, описывающий различия.
  • *** 1,6 **** и — 1,7 —- сообщает нам диапазон строк из первого и второго файлов, которые включены в этот раздел.
  • Строки Ubuntu , Debian , Fedora и последняя пустая строка в обоих файлах одинаковы. Эти строки начинаются с двойного пробела.
  • Строка — Arch Linux из первого файла ничего не соответствует во втором файле. Хотя эта строка также существует во втором файле, позиции другие.
  • Строка + Kubuntu из второго файла ничего не соответствует в первом файле.
  • Линия ! CentOS из первого файла и строк ! Arch Linux и ! CentOS из второго файла меняются между файлами.

По умолчанию количество контекстных строк по умолчанию равно трем. Чтобы указать другой номер, используйте параметр -C ( —contexts ):

Единый формат

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

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

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

  • @@ from-file-line-numbers to-file-line-numbers @@ — Номер строки или диапазон строк из первого и второго файлов, включенных в этот раздел.
  • line-from-files — строки, которые отличаются и строки контекста:
    • Строки, начинающиеся с двух пробелов, являются строками контекста, одинаковыми в обоих файлах.
    • Строки, начинающиеся с символа минуса ( — ), — это строки, которые удаляются из первого файла.
    • Строки, начинающиеся с символа плюса ( + ), — это строки, добавленные из первого файла.

Игнорировать регистр

Как вы могли заметить в приведенных выше примерах, команда diff по умолчанию чувствительна к регистру.

Используйте параметр -i чтобы указать diff игнорировать регистр:

Выводы

Сравнение текстовых файлов на предмет различий — одна из самых распространенных задач системных администраторов Linux.

Команда diff сравнивает файлы построчно. Для получения дополнительной информации введите в терминале man diff .

Если у вас есть вопросы, оставьте комментарий ниже.

Источник

Команда diff в Linux: сравниваем два файла

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

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

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

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

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

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

Читайте также:  Почему не устанавливается windows gpt

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

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

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

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

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

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

  • c — CHANGE — изменение, которое нужно внести в указанной строке первого файла
  • d — DELETE — то, что нужно удалить в первом файле
  • a — ADD — то, что нужно добавить в первый файл

Символ в выводе diff указывает на первый файл, а > — на второй.

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

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

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

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

Далее мы рассмотрим мой любимый способ использования команды diff — параллельный просмотр изменений. Для этого нужно применить флаг -y:

И последний пример — с объединенным выводом. Такой output часто используется как input для команды patch (ее мы тоже рассмотрим):

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

  • -i — для игнорирования регистра. По умолчанию команда diff учитывает регистр.
  • -w — для игнорирования пробелов в файле. По умолчанию пробелы тоже учитываются и могут считаться различием.

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

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

Использование патчей («заплаток») — самый безопасный способ делиться только лишь изменениями.

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

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

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

Но в функции вывода что-то сломалось, и нам нужно внести исправления. Мы отсылаем файл print_in_js.js коллеге, который может исправить код.

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

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

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

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

И — вуаля! — наш код исправлен!

Итоги

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

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

Источник

Сравнение файлов в Linux (команда diff)

Для сравнения двух или нескольких файлов в Linux есть команда diff . Она может сравнивать как отдельные файлы, так и каталоги. Рассмотрим синтаксис, опции команды diff и несколько примеров использования.

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

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

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

Опции команды diff

Рассмотрим основные опции команды diff. Я рассмотрю только те опции, которые сам использую наиболее часто.

-E игнорировать изменения, связанные с добавлением символа табуляции в тексте.
-b игнорировать изменения, связанные с добавлением пробелов.
-w игнорировать изменения, связанные с добавлением пробелов и табуляции.
-B игнорировать новые пустые строки.
-p (или —show-c-function) показать название функции языка C, в которой найдены изменения.
-y (или —side-by-side) отобразить результаты в две колонки.
-r просматривать каталоги рекурсивно.
-X FILE исключить из поиска файлы, имена которых совпадают с шаблонами в файле FILE.
-d (или —minimal) попытаться найти как можно меньше изменений (то есть исключить ложные срабатывания).

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

Сравнение двух текстовых файлов

Для простого сравнения двух текстовых файлов с именами myfile1 и myfile2 выполним в терминале команду:

Вывод команды diff удобно перенаправить в файл с расширением diff . Большинство текстовых редакторов в Linux, например Gedit, распознают этот файл и подсвечивают его синтаксис. Чтобы направить результат сравнения в файл changes.diff нужно использовать символ перенаправления потока (>):

Сравнение директорий, содержащих текстовые файлы

Рассмотрим пример сравнения двух директорий ( mydir1 и mydir2 ), которые содержат текстовые файлы. Основное отличие здесь от примера выше состоит в том, что мы добавим опцию -r , означающую рекурсивный обход файлов в директориях.

Теперь предположим, что в директориях, в которых мы сравниваем файлы, находится много «мусора», который мы не должны сравнивать. Создадим файл excludeFiles и запишем в него шаблоны и названия файлов, которые мы не должны сравнивать. Например, содержимое excludeFiles может иметь вид:

Теперь укажем команде diff, чтобы она использовала наш файл excludeFiles при сравнении каталогов:

Таким образом, мы сравниваем файлы, имена которых не попадают под шаблоны в файле excludeFiles , например, vasya.exe или ChangeLog12 .

Добавим еще несколько опций, которые описаны выше, чтобы улучшить результат сравнения:

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

Заключение

Дополнительную информацию по использованию команды diff в вашей системе Linux вы можете получить, выполнив команду:

Также существуют программы, которые позволяют сравнивать файлы, используя графический интерфейс. Например, программа Meld, которая в наглядном виде показывает где и что изменилось в файлах.

Источник

HuMan: diff

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

Маны команды diff ограничивапются перечислением опций команды, поэтому для ее освоения пришлось провести увлекательное расследование.

Команда diff без опций

И запустим команду:

Попробуем разобраться с выводом команды. Выражение » > крыса» явно означает, что в правом (т.е. втором) файле есть лишнее слово: «крыса». Сложнее расшифровать выражение 1a2. Поскольку «крыса» вторая строка второго файла, то логично предположить, что цифра 2 означает номер строки, различной в сравниваемых файлах. Проверим предположение, поместив «крысу» на 4 строку:

Так и есть, отличается 4 строка второго файла. Появились и мысли насчет первой цифры, а также буквы «a».

Я понял это так:

1. Если считать эталонным первый файл, то 3 означает строку первого файла, после которой добавлена строка «крыса», являющаяся 4 строкой второго файла. Буква «a», по-видимому, означает первую букву в английском слове «added» (добавлено).

2. Если считать эталонным второй файл, то команда diff подсказывает, что надо сделать, дабы превратить первый файл во второй. Надо после третьей строки первого файла добавить (add) четвертую строку второго файла. Тогда файлы станут одинаковыми по содержанию.

Посмотрим, что произойдет, если мы поменяем сравниваемые файлы местами — первым поставим больший файл cot2.txt, а вторым меньший cot.txt:

Номера строк поменялись зеркально, что не удивительно, так как аналогично поменялось и расположение сравниваемых файлов. А вот буква «a» сменилась буквой «d». Рискнем предположить, что это первая буква слова «delete» — удалить. Итак, если удалить четвертую строку первого файла, то файлы станут одинаковыми. Цифра три в правой части выражения 4d3, вероятно, показывает, после какой строки второго файла следует различие в тексте файлов.

Читайте также:  Как добавлять пользователя linux

Осталось рассмотреть случай, когда в сравниваемых файлах одинаковое число строк. Давайте слегка изменим файл cot2.txt, заменив слово «собака» на выражение «собака серая», а «крысу» уберем совсем. Теперь в обоих файлах по три строки.

Программа указывает на разницу во вторых строках файлов. А букву «с» осмелюсь интерпретировать как первую букву слова «change» (заменить). То есть команда подсказывает, что если заменить вторую строку первого файла (cot.txt) на вторую строку второго файла (cot2.txt), то файлы станут одинаковыми.

Поменяем файлы местами:

Как видите, ничего не изменилось, только теперь следует заменить вторую строку файла cot2.txt на вторую строку файла cot.txt.

Появляются некоторые общие соображения:

1. Команда diff не считает какой-либо из файлов эталонным.

2. Команда diff дает подсказку, как сделать файлы одинаковыми.

3. Если вы хотите унифицировать файлы в сторону увеличения, то первым ставьте мЕньший файл.

4. Если вы хотите унифицировать файлы в сторону уменьшения, то первым ставьте бОльший файл.

5.Величина файла измеряется в количестве строк, а не в количестве байт. Если количество строк совпадает, то критерием служит количество слов; если оно совпадает, в дело идут символы.

(Узнать параметры файла можно при помощи команды wc).

Опция -с: Контекстный формат

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

Как видите, этот формат тоже требует разъяснения. Очевидно, что в заголовке указаны сравниваемые файлы, показано, какими условными знаками (звездочками или черточками) будут помечаться относящиеся к ним строки вывода; затем указано время модификации файла (похоже, что с точностью до наносекунды!). А вот что такое +0300, не берусь сказать, может быть выяснится по ходу дальнейших исследований.

Далее следует, так сказать, «тело» вывода. Среди соответствующих условных обозначений (звездочек и черточек) указаны интервалы приведенных строк через запятую (***2,8***), а знаком восклицания помечена строка, не совпадающая в сравниваемых файлах.

Добавим строку «крыса» в конец файла cot2.txt:

Из вывода можно понять, что во втором файле добавилась строка «крыса», но не хотел бы я разбираться с различиями многостраничных файлов, где строки состоят не из одного слова, а из настоящих предложений!

Давайте уберем первую строку первого файла «кот», и, заодно, уменьшим число строк контекста до 0:

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

Ну и ну! Нет, эталоном здесь и пахнет. Чтобы понять этот вывод, нужно сильно напрячься. В первом файле, где «кот» есть, почему-то значится «- кот». Вероятно, нужно убрать кота, чтобы строки стали одинаковы. Но почему же тогда на восьмой строке второго файла, где живет «крыса», значится «+ крыса»? В конце концов, я нашел такое объяснение:

Да-а, к этому формату нужно привыкнуть. Впрочем, есть еще унифицированный формат.

Опция —u: Унифицированный формат

Унифицированный формат по умолчанию не выводит строк контекста:

Присмотревшись и вдумавшись, можно понять следующее:

1. В заголовке сказано, что минусами помечены строки из первого файла, а плюсами — из второго.

2. Формат даты такой же, как у контекстного формата.

3. Диапазоны строк указаны для обоих файлов и отмечены знаками двойной «собаки».

4. Слова, общие для двух файлов ничем не отмечены (или, если хотите, отмечены пробелом).

5. Знаком минус помечены строки, которые есть только в первом файле, как бы изъятые из первого файла, если считать его эталонным.

6. Знаком плюс помечены строки, которых нет в первом файле, как бы добавленные к нему.

Не знаю как вам, но мне этот формат кажется наиболее понятным.

Используя опцию -U число_строк (—unified=число_строк), можно просматривать нужное число строк контекста. Я этого делать не стану, так как мои примерные файлы слишком короткие для этого. Проделайте этот опыт самостоятельно с файлами подлиннее.

Опция -y или —side-by-side (бок-о-бок) Сравнительный формат

Этот формат команды diff выдает две колонки текста, что наиболее наглядно. По умолчанию длина строки 130 символов, что хорошо для длинных строк, для статьи же неудобно. Поэтому я сразу применю опцию -W 25, которая задаст ширину колонки в 25 символов.

Между двумя колонками текста находится узкая колонка условных обозначений. Эти обозначения могут быть следующими:

Пробел Соответствующие строки эквивалентны. Это означает, что либо они одинаковые, либо различие игнорировано из-за одной из опций ‘—ignore’ .

‘|’ Соответствующие строки разные, и либо обе приведены полностью, либо обе не полностью.

‘\’ Соответствующие строки разные, первая строка приведена не полностью.

‘/ ‘ Соответствующие строки разные, вторая строка приведена не полностью.

‘ ‘ Строка содержится только во втором файле.

‘(‘ Строка содержится только в первом файле, но различие игнорируется.

‘)’ Строка содержится только вo втором файле, но различие игнорируется.

У опции -y есть, в свою очередь, несколько опций (или под-опций)

—left-column (левая колонка)

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

Заметим в скобках, что опции —right-column (правая колонка) не существует.

—suppress-common-lines

Жаль, что эта опция не может быть применена вместе с опцией —left-column, добавление которой никак не влияет на вывод команды.

Опция -e или —ed

Мы теперь достаточно знаем о синтаксисе команды diff, чтобы и без редактора понять, что означает этот вывод.

1. Инструкции показывают, как превратить первый файл во второй.

2. «8a крыса » означает добавить после восьмой строки строку «крыса «.

3. «5c бизон» означает заменить пятую строку строкой «бизон».

4. 1d значит удалить первую строку.

Однако, при желании, мы можем воспользоваться редактором ed для превращения файла cot.txt в файл cot2.txt.

Для этого сначала перенаправим вывод команды diff -e cot.txt cot2.txt в файл ed.script, который будет автоматически создан в рабочей директории:

Затем запустим следующую конструкцию:

и проверим результат:

Полагаю, что «заклинание» в командной строке требует некоторого пояснения:

1. Применен программный канал, символом которого служит вертикальная черта (|). Вывод левой части канала служит вводом для правой части (команды ed — cot.txt ).

2. Выражение в скобках в левой части программного канала, означает последовательное выполнение двух команд: cat ed.script и echo w , а знак && между ними означает логическое «и». Благодаря этому знаку вывод обеих команд объединяется:

Мы видим уже знакомый нам скрипт и приписанную командой echo в последней строке букву «w», которая служит командой редактора ed.

3. В правой части программного канала команда ed — cot.txt . Благодаря дефису редактор ed принимает стандартный ввод в качестве командного скрипта. Команды, сгенерированные программой diff -e, изменяют содержимое файла cot.txt, а команда w заставляет переписать этот файл с учетом изменений.

Читайте также:  Вайм ворлд для линукса

Не спрашивайте меня, почему все это так, и как можно иначе, сейчас не время рассматривать работу редактора ed — это тема отдельного исследования.

Важен факт, что файл cot.txt превратился (по своему содержанию, а не по названию) в файл cot2.txt.

Опция -f или —forward-ed (прямой ed)

Опция -n или —rcs

Опция -D NAME

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

Описываемая опция позволяет производить слияние двух файлов — текстов на языке программирования Си. Результат работы ‘diff’ в этом формате будет содержать все строки обоих файлов. Строки общие для файлов отображаются только один раз; разные части разделяются с помощью директив препроцессора Cи ‘#ifdef NAME’ или ‘#ifndef NAME’, ‘#else’, и ‘#endif’. При компиляции, таким образом, можно выбирать какую версию использовать, определяя или оставляя неопределенным макрос NAME. Аргумент NAME — это идентификатор, который будет использовать препроцессор Cи в директивах ‘#ifdef’ и ‘#ifndef’.

Так как я не программист и далек от языка Си, то на этом закончу описание этой важной опции. Она имеет множество суб-опций, и прочих особенностей. Интересующихся отсылаю к переведенному на русский язык руководству .

Сравнение каталогов

Создадим два каталога: dir1 и dir2.

Сравним две директории:

Без опций команда diff не упоминает о файлах с одинаковым содержимым (a-file и c-file), указывает различия в файле b-file, и сообщает о наличие лишнего файла в директории dir2.

Опция -s или —report-identical-files

Очень подробно и понятно.

Опция -r или —recursive

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

Опция -N или —new-file

Однако с опцией -N, команда diff «сделает вид», что пустой файл с тем же именем существует и в первом каталоге, и произведет сравнение содержимого этих файлов, то есть фактически выведет содержимое лишнего файла.

Опция -P или —unidirectional-new-file

Опция -x ОБРАЗЕЦ или —exclude=ОБРАЗЕЦ

Файл a-file был проигнорирован.

Необходимо заметить, что, при применении метасимволов, ОБРАЗЕЦ следует брать в одинарные кавычки.

Были проигнорированы все файлы, имена которых начинаются с букв «a» и «c».

Опцию -x можно использовать несколько раз в одной команде:

Если необходимо многократно использовать опцию -x, то можно составить файл ИМЯ_ФАЙЛА в который и поместить все необходимые ОБРАЗЦЫ по одному на строку. Затем, при помощи опции -X ИМЯ_ФАЙЛА или —exclude-from=ИМЯ_ФАЙЛА заставить команду diff считывать ОБРАЗЦЫ из созданного файла:

Опция -S ИМЯ_ФАЙЛА или —starting-file=ИМЯ_ФАЙЛА

Форматирование вывода команды diff

Опция -t или —expand-tabs

Опция -T или —initial-tab

Опция -l или —paginate

Регулировка производительности команды diff

Опция -d или —minimal

Опция -H или —speed-large-files

Опция —horizon-lines=ЧИСЛО_СТРОК

Данная опция запрещает команде diff отбрасывать ЧИСЛО_СТРОК, в начале и в конце файлов, что дает команде больше возможностей для поиска минимального результата. Понятно, что это замедляет работу команды.

Сравнение трех файлов: Команда diff3

Каждое различие отмечено знаком ====. Если различие касается всех трех файлов, то знак не меняется, если различие относится только к двум файлам, то к знаку добавляются цифры 1, 2 или 3, показывающие какой из трех файлов имеет данное отличие. Буквенные обозначения такие же, как в команде diff.

Команда diff3 имеет свои особенности, свойства и опции, которые в этой статье рассмотрены не будут. Интересующихся отсылаю к подробному руководству на русском языке.

Можно представить себе также команды diff4, diff5 и так далее, но практически такая необходимость возникает редко, да и формат вывода станет весьма громоздким.

Интерактивное объединение файлов при помощи команды sdiff

Правка файлов при помощи команды patch

Сначала нужно сравнить два файла при помощи diff и записать результаты в файл patch.file:

Затем применить команду patch:

Пользуясь инструкциями из файла patch.file команда patch перепишет текст файла cot.txt таким образом, что он станет идентичным тексту файла cot2.txt.

При этом первоначальный текст файла cot.txt будет утерян. Чтобы этого не происходило, следует применять опцию -b (backup).

Тогда программа patch создаст резервную копию файла cot.txt, а сам файл перепишет.

Команда patch «понимает» различные форматы вывода команды diff и автоматически определяет их. Эта команда также имеет немало опций и форматов, которые здесь рассмотрены не будут. Их описание можно найти в упомянутом уже несколько раз руководстве (на русском языке).

Все опции команды diff

—ignore-file-name-case Игнорирует разницу между строчными и заглавными буквами при сравнении файлов.

—no-ignore-file-name-case Учитывает разницу между строчными и заглавными буквами при сравнении файлов.

-E —ignore-tab-expansion Игнорирует изменения, связанные с табуляцией.

-b —ignore-space-change Игнорирует изменения в количестве пробелов.

-w —ignore-all-space Игнорирует все пробелы

-B —ignore-blank-lines Игнорирует изменения, связанные с полностью пустыми строками.

-I РЕГУЛЯРНОЕ_ВЫРАЖЕНИЕ —ignore-matching-lines=РЕГУЛЯРНОЕ_ВЫРАЖЕНИЕ Игнорирует изменения в строках, полностью соответствующих регулярному выражению.

-a —text Считает все файлы текстовыми

-c -C число_строк —context=число_строк Выводит число_строк контекста (по умолчанию 3)

-u -U число_строк —unified=число_строк Выводит число_строк контекста (по умолчанию 3)

—label LABEL Использует LABEL вместо имени файла

-p —show-c-function Сообщает какая функция языка Си затронута каждым отличием

-F РЕГУЛЯРНОЕ_ВЫРАЖЕНИЕ —show-function-line=РЕГУЛЯРНОЕ_ВЫРАЖЕНИЕ Показывает последнюю строку, соответствующую РЕГУЛЯРНОМУ_ВЫРАЖЕНИЮ

-q —brief Сообщает только различны ли файлы

-e —ed Выдает скрипт для редактора ed.

—normal Выводит нормальный формат.

-n —rcs Выводит формат RCS.

-y —side-by-side Выводит сравнительный (бок-о-бок) формат.

-W количество_символов —width=количество_символов Задает ширину колонки вывода (по умолчанию 130 символов)

—left-column Подавляет вывод правой колонки.

—suppress-common-lines Подавляет вывод одинаковых строк

-D NAME —ifdef=NAME Задает объединенный формат вывода ‘#ifdef’, в соответствии с макросом препроцессора NAME.

-l —paginate Пропускает результаты работы через программу pr для разбивки на страницы.

-t —expand-tabs Заменяет табуляцию на пробелы при выводе, для сохранения выравнивания по табуляции во входных файлах.

-T —initial-tab Заменяет на табуляцию пробелы перед текстом строки в нормальном или контекстном формате. Благодаря этому выравнивание по табуляции в строках выглядит нормально.

—tabsize=число_символов Табуляция пропускает число_символов (по умолчанию 8)

-r —recursive При сравнивании каталогов, рекурсивно сравнивает все найденные подкаталоги.

-N —new-file При сравнении каталогов, если файл найден только в одном каталоге, считает, что он находится и во втором, но является пустым.

—unidirectional-new-file При сравнении каталогов, если файл находится только в одном каталоге из двух, считает что он находится и в первом, но является пустым.

-s —report-identical-files Сообщает об одинаковых файлах.

-x ОБРАЗЕЦ —exclude=ОБРАЗЕЦ При сравнивании каталогов, игнорирует файлы и подкаталоги, имена которых начинаются с ОБРАЗЦА

-X FILE —exclude-from=FILE При сравнивании каталогов, игнорирует файлы и подкаталоги, соответствующие ОБРАЗЦАМ, содержащимся в файле FILE.

-S FILE —starting-file=FILE При сравнивании каталогов начинает с файла FILE.

—from-file=FILE1 Сравнивает FILE1 со всеми операндами. FILE1 может быть директорией.

—to-file=FILE2 Сравнивает все операнды с FILE2. FILE2 может быть директорией.

—horizon-lines=ЧИСЛО_СТРОК Не дает отбрасывать последние ЧИСЛО_СТРОК строк начала и первые ЧИСЛО_СТРОК конца файла.

-d —minimal Изменяет алгоритм, возможно находя меньший набор изменений. Это замедляет ‘diff’ (иногда очень сильно).

—speed-large-files Использует эвристику для быстрой обработки больших файлов, имеющих много рассеянных маленьких изменений.

-v —version Выводит номер версии ‘diff’.

Источник

Оцените статью