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

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

patchおよびdiffコマンド

コンピューターにテキストファイルがあると想像してください。そのテキストファイルの修正バージョンを他の誰かから受け取ります。変更したファイルから元のファイルにすべての変更をすばやく転送するにはどうすればよいですか?それはどこだpatchdiff遊びに来ます。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(統合コンテキスト)オプション、サブディレクトリ-rdiff調べるための(再帰的)オプション、および-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上で動作するディレクトリ。

(入力)オプションを使用して、からの命令が含まれているパッチファイルを特定していないことに注意してください。代わりに、我々はにパッチファイルをリダイレクトしていると。-ipatchdiffpatch<

パッチ--dry-run-ruN -d working <slang.patch

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

飛行前のチェックはOKです。離陸の準備ができました。

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

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

パッチ-ruN-d動作<slang.patch

今回は、出力の各行が「チェック」で始まるのではなく、各行が「パッチ」で始まります。

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

あなたの違いを解決する

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