技術ノート Linux Linux でファイルにパッチを適用する (およびパッチを作成する) 方法

Linux でファイルにパッチを適用する (およびパッチを作成する) 方法

Linux patch コマンドを使用すると、あるファイル セットから別のファイル セットに変更を迅速かつ安全に転送できます。 patch 簡単な使い方を学びましょう。

patch コマンドと diff コマンド

コンピュータ上にテキスト ファイルがあると想像してください。そのテキスト ファイルの修正バージョンを他の人から受け取ります。変更されたファイルからすべての変更を元のファイルに素早く転送するにはどうすればよいでしょうか?そこで登場するのが patch diff patch diff 、Linux および macOS などの他の Unix 系オペレーティング システム にあります。

diff コマンドは 、ファイルの 2 つの異なるバージョン を調べて、それらの違いをリストします。差分はパッチ ファイルと呼ばれるファイルに保存できます。

patch コマンドはパッチ ファイルを読み取り、その内容を一連の命令として使用できます。これらの指示に従うと、変更されたファイルの変更が 元のファイルに複製されます

次に、そのプロセスがテキスト ファイルのディレクトリ全体で発生することを想像してください。すべて一度に。それが patch の力です。

変更されたファイルが送信されない場合があります。送信されるのはパッチ ファイルだけです。 1 つのファイルを送信したり、簡単にダウンロードできるように 1 つのファイルを投稿したりできるのに、なぜ何十ものファイルを送信する必要があるでしょうか?

実際にファイルにパッチを適用するには、パッチ ファイルをどうしますか?ほとんど早口言葉のようですが、これも良い質問です。この記事ではそれについて説明します。

patch コマンドは、ソフトウェアのソース コード ファイルを扱う人々によって最もよく使用されますが、ソース コードの有無に関係なく、あらゆるテキスト ファイルのセットに対して同様に機能します。

Linux でファイルにパッチを適用する (およびパッチを作成する) 方法

シナリオ例

このシナリオでは、他の 2 つのディレクトリを含む work というディレクトリにいます。 1 つは作業中と呼ばれ、もう 1 つは最新と呼ばれます。作業ディレクトリには、ソース コード ファイルのセットが保持されます。最新ディレクトリには、これらのソース コード ファイルの最新バージョンが保持されますが、一部は変更されています。

安全のため、作業ディレクトリは現在のバージョンのテキスト ファイルのコピーです。それはそれらの唯一のコピーではありません。

Linux でファイルにパッチを適用する (およびパッチを作成する) 方法

ファイルの 2 つのバージョン間の違いを見つける

diff コマンドは、2 つのファイル間の違いを見つけます。デフォルトのアクションは、端末ウィンドウに変更された行をリストすることです。

1つのファイルが呼び出されます

slang .c

。作業ディレクトリ内のバージョンと最新ディレクトリ内のバージョンを比較します。

-u (統合) オプションは、変更された各セクションの前後の未変更のテキスト行の一部もリストするように diff 指示します。これらの行はコンテキスト行と呼ばれます。これらは、 patch コマンドが元のファイル内の変更が必要な場所を正確に特定するのに役立ちます。

diff どのファイルを比較するかを認識できるように、ファイルの名前を提供します。元のファイルが最初にリストされ、次に変更されたファイルがリストされます。これは diff に発行するコマンドです。

 diff -u working/slang.c 最新/slang.c

diff 、ファイル間の違いを示す出力リストを生成します。ファイルが同一である場合、出力はまったくリストされません。 diff からのこのタイプの出力を見ると、2 つのファイル バージョン間に違いがあること、および元のファイルにパッチが必要であることが確認されます。

Linux でファイルにパッチを適用する (およびパッチを作成する) 方法

パッチファイルの作成

これらの違いをパッチ ファイルにキャプチャするには、次のコマンドを使用します。これは上記と同じコマンドで、 diff からの出力が slang.patch というファイルにリダイレクトされます。

 diff -u working/slang.c 最新/slang.c > slang.patch

パッチファイルの名前は任意です。好きなように呼んでください。 「.patch」拡張子を付けることをお勧めします。ただし、ファイルの種類が明確になるためです。

patch パッチ ファイルに基づいて動作させ、working/slang.c ファイルを変更するには、次のコマンドを使用します。 -u (統合) オプションを使用すると、パッチ ファイルに統合されたコンテキスト行が含まれていることを patch 知らせます。つまり、 diff で -u オプションを使用したので、 patch でも -u オプションを使用します。

パッチ -u working/slang.c -i slang.patch

すべてがうまくいけば、 patch ファイルにパッチを適用していることを示す 1 行の出力が表示されます。

Linux でファイルにパッチを適用する (およびパッチを作成する) 方法

元のファイルのバックアップの作成

-b (バックアップ) オプションを使用すると、パッチが適用されたファイルが変更される前にそのバックアップ コピーを作成するように patch に指示できます。 -i (入力) オプションは、使用するパッチ ファイルの名前を patch に指示します。

パッチ -u -b working/slang.c -i slang.patch

ファイルには以前と同様にパッチが適用され、出力に目に見える違いはありません。ただし、作業フォルダーを調べてみると、slang.c.orig というファイルが作成されていることがわかります。ファイルの日付とタイム スタンプは、 slang.c.orig が元のファイルであり、 slang.c が patch によって作成された新しいファイルであることを示しています。

Linux でファイルにパッチを適用する (およびパッチを作成する) 方法

ディレクトリとの差分を使用する

diff 使用すると、2 つのディレクトリ内のファイル間のすべての相違点を含むパッチ ファイルを作成できます。次に、そのパッチ ファイルを patch とともに使用して、1 つのコマンドで作業フォルダー内のファイルにそれらの差異を適用できます。

diff で使用するオプションは、前に使用した -u (統合コンテキスト) オプション、 diff でサブディレクトリを調べるための -r (再帰) オプション、および -N (新しいファイル) オプションです。

-N オプションは、作業ディレクトリにない最新ディレクトリ内のファイルを処理する方法を diff 指示します。これにより、 diff パッチ ファイルに命令を挿入するよう強制され、最新のディレクトリには存在するが作業ディレクトリには存在しないファイルが patch によって作成されます。

単一のハイフン ( - ) を使用するようにオプションをまとめることもできます。

ここではディレクトリ名を提供しているだけであり、 diff に特定のファイルを参照するように指示しているわけではないことに注意してください。

 diff -ruN 作業/最新/ > slang.patch 

Linux でファイルにパッチを適用する (およびパッチを作成する) 方法

パッチファイルの内部を覗く

パッチファイルを簡単に見てみましょう。内容を見てみるために、 less 使用します。

ファイルの先頭には、slang.c の 2 つのバージョンの違いが示されています。

パッチ ファイルをさらに下にスクロールすると、structs.h という別のファイルの変更が記述されていることがわかります。これにより、パッチ ファイルに複数のファイルの異なるバージョン間の差異が確実に含まれていることを確認します。

石橋を叩いて渡る

大量のファイルのコレクションにパッチを適用するのは少し不安になる可能性があるため、思い切って変更を加える前に、 --dry-run オプションを使用してすべてが正常であることを確認します。

--dry-run オプションは、実際にファイルを変更すること以外のすべてを行うように patch 指示します。 patch ファイルのすべてのプリフライト チェックを実行し、問題が発生した場合は報告します。いずれの場合も、ファイルは変更されません。

問題が報告されない場合は、 --dry-run オプションを指定せずにコマンドを繰り返し、自信を持ってファイルにパッチを適用できます。

-d (ディレクトリ) オプションは、どのディレクトリで作業するかを patch 指示します。

どのパッチ ファイルに diff からの命令が含まれているかを patch に伝えるために -i (入力) オプションを使用していないことに注意してください。代わりに、パッチ ファイルを < を使用して patch にリダイレクトします。

 patch --dry-run -ruN -d working < slang.patch

diff ディレクトリ全体から、パッチを適用する 2 つのファイルを見つけました。これら 2 つのファイルの変更に関する指示は patch によってチェックされており、問題は報告されていません。

飛行前のチェックは問題ありません。離陸の準備はできています。

ディレクトリにパッチを適用する

ファイルにパッチを実際に適用するには、 --dry-run オプションを付けずに前のコマンドを使用します。

 patch -ruN -d working < slang.patch

今回は、出力の各行は「checking」ではなく、「patching」で始まります。

そして問題は報告されていません。ソース コードをコンパイルすると、ソフトウェアの最新バージョンが使用されます。

意見の相違を解決する

これは、 patch を使用する最も簡単で安全な方法です。ターゲット ファイルをフォルダーにコピーし、そのフォルダーにパッチを適用します。パッチ適用プロセスがエラーなく完了したことに満足したら、それらをコピーして戻します。

Linuxコマンド

ファイル

tar pv cat tac chmod grep diff sed ar man pushd popd fsck testdisk seq fd pandoc cd $PATH awk join jq fold uniq journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · · mkdir · du · ln · パッチ · 変換 · rclone · シュレッド · srm · scp · gzip · chattr · カット · 検索 · umask · wc · tr

プロセス

エイリアス · スクリーン · トップ · ナイス · renice · 進行状況 · strace · systemd · tmux · chsh · 履歴 · at · バッチ · フリー · what · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · タイムアウト · ウォール · はい · キル · スリープ · sudo · su · タイム · groupadd · usermod · · lshw · シャットダウン · 再起動 · 停止 · パワーオフ · パスワード · lscpu · crontab · 日付 · bg · fg · pidof · nohup · pmap

ネットワーキング

netstat ping ip ss whois fail2ban bmon dig finger nmap ftp curl wget who whoami w iptables ssh-keygen ufw arping firewalld

関連: 開発者と愛好家のための最高の Linux ラップトップ

「Linux でファイルにパッチを適用する (およびパッチを作成する) 方法」に関するベスト動画選定!

【Linuxコマンドの基本01】 ファイルを管理する Bash上でファイル、ディレクトリを作る、消す、そして、ファイルとはなにか、ディレクトリとは? 初心者にわかりやすく解説。
LPIC:ファイルの解凍:unxzコマンド