img

Linux: команда diff – как сравнить два файла и применить изменения с помощью команды patch

Представьте, что одним прекрасным днем вы просыпаетесь и понимаете, что ваш программный комплекс не работает, в нем есть ошибка, которую необходимо найти. Такое и в страшном сне не присниться.  

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

Благо, есть такая утилита Linux под названием diff, которая прикроет вашу спину.

Что такое команда diff?

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

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

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

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

Ниже представлен синтаксис команды diff:

diff [options] file1 file2

Синтаксис diff

В зависимости от изменений, команда diff может отображать три символа:

Символ

Значение

c

CHANGE – необходимо внести изменения.

d

DELETE – необходимо что-то удалить.

a

ADD – необходимо что-то добавить. 

В выводе команды diff символ < указывает на первый файл, а символ > - на второй, который используется в качестве ссылки. 

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

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

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

image-63

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

image-64

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

Просто воспользуйтесь флагом -y, как показано ниже:

diff -y file1 file2

image-50

Наглядное сравнение файлов

Последний пример, который бы я хотел привести – это пример унифицированного вывода. Эти выходные данные зачастую используются в качестве входных данных для команды patch. Заодно мы посмотрим, как работает команда patch:

image-67

Унифицированный вывод, который используется в качестве входных данных для команды patch

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

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

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

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

Использование команды patch - это самый безопасный способ передачи этих исправлений. 

Давайте взглянем, как работает команда patch:

patch file_to_change < patch_file

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

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

Вот пример внесения исправлений: допустим, что у нас есть простой код JavaScript [имя файла: print_in_js,js], который печатает строку.

image-68

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

Для начала наш коллега находит неправильный тип в строке под номером 3. Он исправляет файл. 

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

diff -u print_in_js.js  print_in_js_Fixed.js > patched_print_js.diff

Создание «заплатки»

Давайте проверим содержимое этой «заплатки»:

image-69

Содержимое «заплатки»

Теперь, когда у нас есть «заплатка», мы можем ее применить:

patch print_in_js.js  < patched_print_js.diff

Применение «заплатки»

image-72

Исправленный код после применения «заплатки»

И да, наш код исправлен!

Заключение

Создавать и применять «заплатки» с помощью команд patch и diff довольно легко.  Аналогичный подход используют системы контроля версий, например, Git или SVN. Изучив основы, вы с легкостью сможете понять, как работает контроль версий, и начать его использовать, ведь именно он является важным аспектом разработки программного обеспечения.

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
Программирование
Скидка 25%
Python Advanced. Продвинутый курс
Освойте асинхронное и метапрограммирование, изучите аннотацию типов и напишите собственное приложение на FastAPI. Улучшите свои навыки Python, чтобы совершить быстрый рост вашего грейда до уровня middle.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
Гипервизор - это программное обеспечение для виртуализации, используемое для создания и запуска виртуальных машин (ВМ). Гипервиз
img
Виртуализация серверов позволяет запускать несколько виртуальных машин на одном физическом сервере. Запуск виртуальных машин (ВМ
img
Сегодня мы рассмотрим, как настроить и использовать PHP в проекте. Но прежде чем начать, нужно понять, что такое PHP. Что такое
img
Как разработчик, вы знаете, что HTML расшифровывается как HyperText Markup Language (язык разметки гипертекста). HTML — это язык
img
Бесконечные споры вокруг искусственного интеллекта приводят к путанице. Существует много терминов, которые кажутся похожими, но
img
SVG расшифровывается как масштабируемая векторная графика. Это веб-дружелюбный векторный формат файлов, используемый для отображ
ОСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59