Linux
patch
コマンドを使用すると、あるファイル セットから別のファイル セットに変更を迅速かつ安全に転送できます。
patch
簡単な使い方を学びましょう。
patch コマンドと diff コマンド
コンピュータ上にテキスト ファイルがあると想像してください。そのテキスト ファイルの修正バージョンを他の人から受け取ります。変更されたファイルからすべての変更を元のファイルに素早く転送するにはどうすればよいでしょうか?そこで登場するのが
patch
と
diff
。
patch
と
diff
、Linux および macOS などの他の
Unix 系オペレーティング システム
にあります。
diff
コマンドは
、ファイルの 2 つの異なるバージョン
を調べて、それらの違いをリストします。差分はパッチ ファイルと呼ばれるファイルに保存できます。
patch
コマンドはパッチ ファイルを読み取り、その内容を一連の命令として使用できます。これらの指示に従うと、変更されたファイルの変更が
元のファイルに複製されます
。
次に、そのプロセスがテキスト ファイルのディレクトリ全体で発生することを想像してください。すべて一度に。それが
patch
の力です。
変更されたファイルが送信されない場合があります。送信されるのはパッチ ファイルだけです。 1 つのファイルを送信したり、簡単にダウンロードできるように 1 つのファイルを投稿したりできるのに、なぜ何十ものファイルを送信する必要があるでしょうか?
実際にファイルにパッチを適用するには、パッチ ファイルをどうしますか?ほとんど早口言葉のようですが、これも良い質問です。この記事ではそれについて説明します。
patch
コマンドは、ソフトウェアのソース コード ファイルを扱う人々によって最もよく使用されますが、ソース コードの有無に関係なく、あらゆるテキスト ファイルのセットに対して同様に機能します。
シナリオ例
このシナリオでは、他の 2 つのディレクトリを含む work というディレクトリにいます。 1 つは作業中と呼ばれ、もう 1 つは最新と呼ばれます。作業ディレクトリには、ソース コード ファイルのセットが保持されます。最新ディレクトリには、これらのソース コード ファイルの最新バージョンが保持されますが、一部は変更されています。
安全のため、作業ディレクトリは現在のバージョンのテキスト ファイルのコピーです。それはそれらの唯一のコピーではありません。
ファイルの 2 つのバージョン間の違いを見つける
diff
コマンドは、2 つのファイル間の違いを見つけます。デフォルトのアクションは、端末ウィンドウに変更された行をリストすることです。
1つのファイルが呼び出されます
slang .c
。作業ディレクトリ内のバージョンと最新ディレクトリ内のバージョンを比較します。
-u
(統合) オプションは、変更された各セクションの前後の未変更のテキスト行の一部もリストするように
diff
指示します。これらの行はコンテキスト行と呼ばれます。これらは、
patch
コマンドが元のファイル内の変更が必要な場所を正確に特定するのに役立ちます。
diff
どのファイルを比較するかを認識できるように、ファイルの名前を提供します。元のファイルが最初にリストされ、次に変更されたファイルがリストされます。これは
diff
に発行するコマンドです。
diff -u working/slang.c 最新/slang.c
diff
、ファイル間の違いを示す出力リストを生成します。ファイルが同一である場合、出力はまったくリストされません。
diff
からのこのタイプの出力を見ると、2 つのファイル バージョン間に違いがあること、および元のファイルにパッチが必要であることが確認されます。
パッチファイルの作成
これらの違いをパッチ ファイルにキャプチャするには、次のコマンドを使用します。これは上記と同じコマンドで、
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 行の出力が表示されます。
元のファイルのバックアップの作成
-b
(バックアップ) オプションを使用すると、パッチが適用されたファイルが変更される前にそのバックアップ コピーを作成するように
patch
に指示できます。
-i
(入力) オプションは、使用するパッチ ファイルの名前を patch に指示します。
パッチ -u -b working/slang.c -i slang.patch
ファイルには以前と同様にパッチが適用され、出力に目に見える違いはありません。ただし、作業フォルダーを調べてみると、slang.c.orig というファイルが作成されていることがわかります。ファイルの日付とタイム スタンプは、 slang.c.orig が元のファイルであり、 slang.c が
patch
によって作成された新しいファイルであることを示しています。
ディレクトリとの差分を使用する
diff
使用すると、2 つのディレクトリ内のファイル間のすべての相違点を含むパッチ ファイルを作成できます。次に、そのパッチ ファイルを
patch
とともに使用して、1 つのコマンドで作業フォルダー内のファイルにそれらの差異を適用できます。
diff
で使用するオプションは、前に使用した
-u
(統合コンテキスト) オプション、
diff
でサブディレクトリを調べるための
-r
(再帰) オプション、および
-N
(新しいファイル) オプションです。
-N
オプションは、作業ディレクトリにない最新ディレクトリ内のファイルを処理する方法を
diff
指示します。これにより、
diff
パッチ ファイルに命令を挿入するよう強制され、最新のディレクトリには存在するが作業ディレクトリには存在しないファイルが
patch
によって作成されます。
単一のハイフン (
-
) を使用するようにオプションをまとめることもできます。
ここではディレクトリ名を提供しているだけであり、
diff
に特定のファイルを参照するように指示しているわけではないことに注意してください。
diff -ruN 作業/最新/ > slang.patch
パッチファイルの内部を覗く
パッチファイルを簡単に見てみましょう。内容を見てみるために、
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 ラップトップ





