Linuxでファイルにパッチを適用する(およびパッチを作成する)方法
Linuxpatch
コマンドを使用すると、あるファイルセットから別のファイルセットに変更をすばやく安全に転送できます。patch
簡単な方法の使い方を学びましょう。
patchおよびdiffコマンド
コンピューターにテキストファイルがあると想像してください。そのテキストファイルの修正バージョンを他の誰かから受け取ります。変更したファイルから元のファイルにすべての変更をすばやく転送するにはどうすればよいですか?それはどこだpatch
とdiff
遊びに来ます。patch
そしてdiff
、このようなMacOSのようLinuxや他のUnixライクなオペレーティングシステムで発見されています。
このdiff
コマンドは、ファイルの2つの異なるバージョンを調べ、それらの違いを一覧表示します。違いは、パッチファイルと呼ばれるファイルに保存できます。
この patch
コマンドは、パッチファイルを読み取り、その内容を一連の命令として使用できます。これらの指示に従うことにより、変更されたファイルの変更が元のファイルに複製されます。
ここで、プロセスがテキストファイルのディレクトリ全体で発生していると想像してください。オールインワンゴー。それがの力ですpatch
。
変更されたファイルが送信されない場合があります。送信されるのはパッチファイルだけです。1つのファイルを送信したり、簡単にダウンロードできるように1つのファイルを投稿したりできるのに、なぜ何十ものファイルを送信するのでしょうか。
実際にファイルにパッチを適用するには、パッチファイルをどのように処理しますか?ほとんど早口言葉であることは別として、それも良い質問です。この記事では、それについて説明します。
このpatch
コマンドは、ソフトウェアのソースコードファイルを扱う人々によって最も頻繁に使用されますが、目的、ソースコードの有無に関係なく、テキストファイルの任意のセットで同様に機能します。
関連:Linuxターミナルで2つのテキストファイルを比較する方法
シナリオ例
このシナリオでは、他の2つのディレクトリを含むworkというディレクトリにいます。1つは作業と呼ばれ、もう1つは最新と呼ばれます。作業ディレクトリには、一連のソースコードファイルが保持されます。最新のディレクトリには、これらのソースコードファイルの最新バージョンが保持されており、その一部は変更されています。
安全のために、作業ディレクトリはテキストファイルの現在のバージョンのコピーです。それらのコピーはそれだけではありません。
ファイルの2つのバージョン間の違いを見つける
このdiff
コマンドは、2つのファイルの違いを見つけます。デフォルトのアクションは、変更された行をターミナルウィンドウに一覧表示することです。
1つのファイルはと呼ばれslang.c
ます。作業ディレクトリのバージョンを最新のディレクトリのバージョンと比較します。
-u
(統一)オプションが伝えdiff
も前と変更されたセクションの各後から未修正テキスト行のいくつかをリストします。これらの行はコンテキスト行と呼ばれます。これらは、patch
コマンドが元のファイルで変更を加える必要がある場所を正確に見つけるのに役立ち ます。
diff
比較するファイルがわかるように、ファイルの名前を提供します。元のファイルが最初にリストされ、次に変更されたファイルがリストされます。これは私たちが発行するコマンドdiff
です:
diff -u working / slang.c latest / slang.c
diff
ファイル間の違いを示す出力リストを生成します。ファイルが同一である場合、出力はまったくリストされません。からのこのタイプの出力を見るとdiff
、2つのファイルバージョンに違いがあり、元のファイルにパッチを適用する必要があることが確認されます。
パッチファイルの作成
これらの違いをパッチファイルに取り込むには、次のコマンドを使用します。これは上記と同じコマンドですが、からの出力diff
はslang.patchというファイルにリダイレクトされます。
diff -u working / slang.c latest / slang.c> slang.patch
パッチファイルの名前は任意です。あなたはそれを好きなように呼ぶことができます。「.patch」拡張子を付けることをお勧めします。ただし、それがどのタイプのファイルであるかを明確にするので。
ようにするには patch
、パッチファイルに作用し、作業/ slang.cファイルを修正し、次のコマンドを使用します。-u
(統一)オプションができますpatch
パッチファイルは、統一されたコンテキスト行が含まれていることを知っています。つまり、-uオプションをdiffとともに使用したため、この-u
オプションをpatch
。とともに使用します。
パッチ-uworking.slang.c-i slang.patch
すべてがうまくpatch
いけば、ファイルにパッチを適用していることを示す1行の出力があります。
元のファイルのバックアップを作成する
(バックアップ)オプションpatch
を使用して、パッチを適用したファイルを変更する前にバックアップコピーを作成する ように指示でき-b
ます。-i
(入力)オプションは、使用するパッチファイルの名前をパッチ伝えます:
パッチ-u-b working.slang.c -i slang.patch
ファイルには以前と同じようにパッチが適用され、出力に目に見える違いはありません。ただし、作業フォルダーを調べると、slang.c.origというファイルが作成されていることがわかります。ファイルの日付とタイムスタンプは、slang.c.origが元のファイルであり、slang.cがによって作成された新しいファイルであることを示していますpatch
。
ディレクトリでの差分の使用
を使用diff
して、2つのディレクトリ内のファイル間のすべての違いを含むパッチファイルを作成できます。次に、そのパッチファイルをで使用しpatch
て、1つのコマンドで作業フォルダー内のファイルにそれらの違いを適用できます。
使用するオプションは、以前に使用しdiff
た-u
(統合コンテキスト)オプション、サブディレクトリ-r
をdiff
調べるための(再帰的)オプション、および-N
(新しいファイル)オプションです。
この-N
オプションはdiff
、作業ディレクトリにない最新のディレクトリ内のファイルを処理する方法を示します。diff
パッチファイルに命令を強制的に配置patch
して、最新のディレクトリには存在するが作業ディレクトリにはないファイルを作成します。
オプションをまとめて、単一のハイフン(-
)を使用することができます。
ディレクトリ名のみを提供していることに注意してください。diff
特定のファイルを確認するように指示しているわけではありません。
diff -ruN working / latest /> slang.patch
パッチファイルの内部を覗く
パッチファイルをざっと見てみましょう。私たちは使用しますless
、その内容を見て。
ファイルの先頭には、2つのバージョンのslang.cの違いが示されています。
パッチファイルをさらに下にスクロールすると、structs.hという別のファイルの変更が記述されていることがわかります。これにより、パッチファイルに複数のファイルの異なるバージョン間の違いが確実に含まれていることが確認されます。
石橋を叩いて渡る
大量のファイルのコレクションにパッチを適用するのは少し不安になる可能性がある--dry-run
ため、思い切って変更を加える前に、すべてが正常であることを確認するオプションを使用します。
この--dry-run
オプションはpatch
、実際にファイルを変更する以外のすべてを行うように指示します。patch
はファイルに対してすべての飛行前チェックを実行し、問題が発生した場合はそれらを報告します。いずれにせよ、ファイルは変更されません。
問題が報告されていない場合は、--dry-run
オプションなしでコマンドを繰り返し、自信を持ってファイルにパッチを適用できます。
-d
(ディレクトリ)オプションTELLpatch
上で動作するディレクトリ。
(入力)オプションを使用して、からの命令が含まれているパッチファイルを特定していないことに注意してください。代わりに、我々はにパッチファイルをリダイレクトしていると。-i
patch
diff
patch
<
パッチ--dry-run-ruN -d working <slang.patch
ディレクトリ全体diff
から、パッチを適用する2つのファイルが見つかりました。これら2つのファイルの変更に関する指示は、によってチェックされpatch
ており、問題は報告されていません。
飛行前のチェックはOKです。離陸の準備ができました。
ディレクトリにパッチを適用する
パッチをファイルに真に適用するには、--dry-run
オプションなしで前のコマンドを使用します。
パッチ-ruN-d動作<slang.patch
今回は、出力の各行が「チェック」で始まるのではなく、各行が「パッチ」で始まります。
また、問題は報告されていません。ソースコードをコンパイルすることができ、ソフトウェアの最新バージョンを使用することになります。
あなたの違いを解決する
これは、これまでで最も簡単で安全な使用方法 patch
です。ターゲットファイルをフォルダーにコピーし、そのフォルダーにパッチを適用します。パッチ適用プロセスがエラーなしで完了したことを確認したら、それらをコピーして戻します。