Як застосувати виправлення до файлу (і створити патчі) у Linux

Команда Linux patch дозволяє швидко та безпечно переносити зміни з одного набору файлів в інший. Дізнайтеся, як використовувати патч простим способом.

Команди patch і diff

Уявіть, що на вашому комп’ютері є текстовий файл. Ви отримуєте змінену версію цього текстового файлу від когось іншого. Як швидко перенести всі зміни зі зміненого файлу в оригінальний файл? Ось тут у гру вступають патч і відмінність. patch і diff можна знайти в Linux та інших Unix-подібних операційних системах, таких як macOS.

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

Команда patch може читати файл виправлення та використовувати його вміст як набір інструкцій. Дотримуючись цих інструкцій, зміни у зміненому файлі є відтворено в оригіналі файл.

Тепер уявіть, що цей процес відбувається з цілим каталогом текстових файлів. Все за один прийом. Це сила патча.

Іноді вам не надсилають змінені файли. Все, що ви отримаєте, це файл виправлення. Навіщо надсилати десятки файлів, коли ви можете надіслати один файл або опублікувати один файл для легкого завантаження?

Що ви робите з файлом виправлення, щоб насправді виправити свої файли? Окрім того, що це майже скоромовка, це також гарне запитання. Ми розповімо вам про це в цій статті.

Команда patch найчастіше використовується людьми, які працюють з файлами вихідного коду програмного забезпечення, але вона однаково добре працює з будь-яким набором текстових файлів, незалежно від їх призначення, вихідного коду чи ні.

Наш приклад сценарію

У цьому сценарії ми знаходимося в каталозі під назвою work, який містить два інші каталоги. Один називається робочим, а другий — останнім. Робочий каталог містить набір файлів вихідного коду. Останній каталог містить найновішу версію цих файлів вихідного коду, деякі з яких були змінені.

  7 основних програм Linux, які повинен встановити кожен користувач

Для безпеки робочий каталог є копією поточної версії текстових файлів. Це не єдина їх копія.

Знайти відмінності між двома версіями файлу

Команда diff знаходить відмінності між двома файлами. Його дія за замовчуванням полягає в переліку змінених рядків у вікні терміналу.

Один файл називається sleng.c. Ми порівняємо версію в робочому каталозі з версією в останньому каталозі.

Параметр -u (уніфікований) наказує diff також перераховувати деякі незмінені рядки тексту до та після кожного з змінених розділів. Ці рядки називаються контекстними. Вони допомагають команді patch точно визначити, де потрібно внести зміни в оригінальному файлі.

Ми надаємо назви файлів, щоб diff знав, які файли порівнювати. Спочатку вказано оригінальний файл, а потім змінений файл. Це команда, яку ми надаємо для diff:

diff -u working/slang.c latest/slang.c

diff створює вихідний список, що показує відмінності між файлами. Якби файли були ідентичними, вихідних даних не було б у списку взагалі. Побачивши цей тип виводу з diff, ви підтверджуєте, що між двома версіями файлів є відмінності і що вихідний файл потребує виправлення.

Створення файлу виправлення

Щоб зафіксувати ці відмінності у файлі виправлення, скористайтеся такою командою. Це та сама команда, що й вище, з виводом з diff, перенаправленим у файл під назвою slang.patch.

diff -u working/slang.c latest/slang.c > slang.patch

diff -u working/slang.c latest/slang.c > slang.patch у вікні терміналу” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Назва файлу виправлення є довільним.  Ви можете називати це як завгодно.  Надати йому розширення “.patch” – гарна ідея;  однак, оскільки він чітко вказує, який це тип файлу.</p>
<p>Щоб змусити patch діяти на файл виправлення та змінити файл work/slang.c, скористайтеся такою командою.  Параметр -u (уніфікований) дозволяє patch знати, що файл виправлення містить уніфіковані рядки контексту.  Іншими словами, ми використовували параметр -u з diff, тому ми використовуємо параметр -u з патчем.</p>
<div style=

patch -u working.slang.c -i slang.patch

Якщо все пройшло добре, буде один рядок, який повідомляє, що виправлення виправляє файл.

Створення резервної копії оригінального файлу

Ми можемо доручити patch створити резервну копію виправлених файлів перед їх зміною за допомогою параметра -b (резервне копіювання). Параметр -i (вхід) повідомляє назву файлу виправлення, який потрібно використовувати:

patch -u -b working.slang.c -i slang.patch

Файл виправлено, як і раніше, без видимої різниці у результатах. Однак, якщо ви заглянете в робочу папку, ви побачите, що файл під назвою slang.c.orig створено. Позначки дати та часу файлів показують, що slang.c.orig є оригінальним файлом, а sleng.c — новим файлом, створеним за допомогою виправлення.

Використання diff With Directories

Ми можемо використовувати diff, щоб створити файл виправлення, який містить усі відмінності між файлами в двох каталогах. Потім ми можемо використовувати цей файл виправлення з виправленням, щоб застосувати ці відмінності до файлів у робочій папці за допомогою однієї команди.

Параметри, які ми збираємося використовувати з diff, — це параметр -u (уніфікований контекст), який ми використовували раніше, -r (рекурсивний), щоб змусити diff переглядати будь-які підкаталоги, і параметр -N (новий файл).

Параметр -N вказує diff, як обробляти файли в останньому каталозі, яких немає в робочому каталозі. Це змушує diff помістити інструкції у файл виправлення, щоб patch створював файли, які є в останньому каталозі, але відсутні в робочому каталозі.

Ви можете об’єднати параметри разом, щоб вони використовували один дефіс (-).

Зауважте, що ми надаємо лише назви каталогів, ми не кажемо diff переглядати конкретні файли:

diff -ruN working/ latest/ > slang.patch

diff -ruN work/ latest/ > slang.patch” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<h2 role=Заглядаючи всередину файлу виправлення

Давайте швидко заглянемо у файл виправлення. Ми будемо використовувати менше, щоб подивитися на його вміст.

  Як використовувати BleachBit в Linux

У верхній частині файлу показано відмінності між двома версіями slang.c.

Прокручуючи файл виправлення вниз, ми бачимо, що він описує зміни в іншому файлі під назвою structs.h. Це підтверджує, що файл виправлення точно містить відмінності між різними версіями кількох файлів.

Сім разів відміряй, один раз відріж

Виправлення великої колекції файлів може трохи нервувати, тому ми скористаємося опцією –dry-run, щоб перевірити, чи все гаразд, перш ніж зважитися та взяти на себе зобов’язання вносити зміни.

Параметр –dry-run наказує patch робити все, крім фактичної зміни файлів. patch виконає всі свої перевірки файлів перед запуском, і якщо він стикається з проблемами, він повідомляє про них. У будь-якому випадку, жодні файли не змінюються.

Якщо проблем не буде, ми можемо повторити команду без параметра –dry-run і впевнено виправити наші файли.

Параметр -d (каталог) вказує патчу, з яким каталогом працювати.

Зауважте, що ми не використовуємо параметр -i (введення), щоб сказати патчу, який файл виправлення містить інструкції з diff. Замість цього ми перенаправляємо файл виправлення в патч з <. wp_automatic_readability="17.5">

patch --dry-run -ruN -d working 

Out of the entire directory, diff found two files to patch. The instructions regarding the modifications for those two files have been checked by patch , and no problems have been reported.

Pre-flight checks are OK; we’re ready for take-off.

Patching a Directory

To genuinely apply the patches to the files we use the previous command without the --dry-run option.

patch -ruN -d working 

This time each line of output doesn’t start with “checking,” each line starts with “patching.”

And no problems are reported. We can compile our source code, and we’ll be on the latest version of the software.

Settle Your Differences

This is by far the easiest and safest way to use patch. Copy your target files to a folder and patch that folder. Copy them back when you’re happy that the patching process completed error free.