ウェブサイト検索

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


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

パッチと diff コマンド

コンピュータにテキストファイルがあると想像してください。そのテキストファイルの修正されたバージョンを誰かから受け取ります。その修正されたファイルから元のファイルにすべての変更を迅速に転送するにはどうしますか?そこで、patchとdiffの出番です。patchとdiffは、LinuxやmacOSなどの他のUnix系オペレーティングシステムに存在します。

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

patchコマンドはパッチファイルを読み込み、その内容を一連の指示として使用することができます。それらの指示に従うことによって、変更されたファイルの変更が元のファイルに再現されます。

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

時々、修正されたファイルが送られてこないことがあります。送られてくるのはパッチファイルだけです。簡単にダウンロードできるファイルを1つ送ることができるのに、なぜ何十ものファイルを送るのでしょうか?

パッチファイルを使って実際にファイルをパッチするにはどうすればいいですか? ほぼ早口言葉のようですが、それも良い質問です。この文章では、その手順について説明します。

patch コマンドは、主にソフトウェアソースコードファイルに取り組む人々によって使用されますが、その目的やソースコードであるかどうかに関わらず、あらゆるテキストファイルのセットにも同様に適用できます。

私たちの例のシナリオ

このシナリオでは、workというディレクトリの中にworkingというディレクトリとlatestというディレクトリの2つがあります。workingディレクトリには一連のソースコードファイルが格納されています。latestディレクトリには、ソースコードファイルの最新バージョンが格納されており、その中には一部が修正されたものも含まれています。

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

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

diffコマンドは、2つのファイルの違いを見つけます。そのデフォルトの動作は、変更された行をターミナルウィンドウにリストすることです。

一つのファイルはこう呼ばれています

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 にパッチファイルが統合されたコンテキスト行を含んでいることを知らせます。言い換えれば、diffとともに-uオプションを使用したので、patchとともに-uオプションを使用します。

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

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

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

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

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

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

ディレクトリを使ったdiff

diffを使って、2つのディレクトリのファイル間のすべての違いを含むパッチファイルを作成することができます。その後、そのパッチファイルをpatchと一緒に使用して、作業フォルダ内のファイルに対して、1つのコマンドでその違いを適用することができます。

私たちが diff で使うオプションは、以前使用した -u(統合コンテキスト)オプション、diff がサブディレクトリも調べるための -r(再帰的)オプション、そして -N(新しいファイル)オプションです。

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

オプションをまとめて、一つのハイフン(-)を使用することができます。

私たちはディレクトリ名のみを提供しており、特定のファイルを見させるようにdiffに指示しているわけではありません。

diff -ruN working/ latest/ > 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コマンド

ファイル

t

プロセス

A

ネットワーキング

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

関連:開発者と愛好者のためのベストLinuxラップトップ

関連記事: