img

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

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

icon strelka icons icons

узнай больше на курсе

Python программист с нуля
Стань разработчиком на одном из самых популярных языков программирования - Python
Подробнее о курсе
Java-разработчик с нуля
Освойте backend-разработку и программирование на Java, фреймворки Spring и Maven, работу с базами данных и API
Подробнее о курсе
C# разработчик с нуля
На курсе ты освоишь основы программирования на C#, включая синтаксис, объектно-ориентированное программирование и асинхронное программирование.
Подробнее о курсе

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

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

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
icon strelka icons icons

узнай больше на курсе

Python программист с нуля
Стань разработчиком на одном из самых популярных языков программирования - Python
Подробнее о курсе
Java-разработчик с нуля
Освойте backend-разработку и программирование на Java, фреймворки Spring и Maven, работу с базами данных и API
Подробнее о курсе
C# разработчик с нуля
На курсе ты освоишь основы программирования на C#, включая синтаксис, объектно-ориентированное программирование и асинхронное программирование.
Подробнее о курсе
Фронтенд-разработчик с нуля
Погрузитесь в мир веб-разработки, освоив основные инструменты работы: HTML, CSS, JavaScript
Подробнее о курсе
Разработка приложений на Flutter и Dart
Научись создавать кроссплатформенные приложения на Flutter, освой язык Dart
Подробнее о курсе
Автоматизированное тестирование на Python
Изучите автоматизацию тестирования на Python чтобы стать востребованным специалистом
Подробнее о курсе
Еще по теме:
img
Делаем код-ревью корректно - с уважением, эффективностью и улучшением качества, не раздражая коллег
img
Java 21 имеет ряд улучшений в производительности и синтаксисе, однако есть подводные камни. В статье расскажем все о рисках и как сделать миграцию безболезненной
img
Готов узнать что такое gRPC, как работает и для чего нужно? Не, не, это не GPRS, не путай! А ещё расскажем про Protobuf!
img
React - это популярная Javascript библиотека для создания интерфейсов. Узнай, почему её выбирают миллионы девелоперов по всему миру
img
Почему стоит выучить C#? Пять сильных причин, от высокой зарплаты до кроссплатформенности
ЛЕТНИЕ СКИДКИ
30%
40%
50%
До конца акции: 30 дней 24 : 59 : 59