はじめに
こんにちは。ネットワークエンジニアの「だいまる」です。
今回はPatchコマンドについて、少し深く理解してみたいと思ったのでまとめてみました。
Patchコマンドとは?

そもそもPatchコマンドって何?
Patchコマンドとは「カーネルのUpdate等を行う際に利用するコマンド」になります。
2つのファイル差分を「Diffコマンド」で取得、出力することで「パッチファイル」を作成します。

上記の前提を理解することは非常に大事!
作成したパッチファイルを「Patchコマンド」で指定のファイルに差分を追加します。

なぜこのようなことを実施するのか?
OldファイルをNewファイルに置き換えればいいじゃん!と一瞬思います。
正直、それでも問題はないですが、手間が省けたり、重要なファイルを誤ってコピー・削除したりするリスクを防ぐことができます。

昔は大きなサイズのファイルをダウンロードするのが大変だったのもあるみたい

Patchコマンドの使い方
Patchコマンドの概要を理解した後は、使い方を頭に入れていこう!
Patchコマンドの書式
Patchコマンドの一般的な書式は以下の通りです。
パターン①:通常
#patch (オプション) (対象元) (パッチファイル)
パターン②:リダイレクト
#patch (オプション) < (パッチファイル)
パターン③:パイプ
#cat (パッチファイル) | patch (オプション)
「パッチファイル」がdiffコマンドで作成したファイルになり、「対象元」は変更したいファイルになります。
では、オプション一覧を見ていきましょう!
オプション | 詳細 |
-pN | -p0:パッチ内のパスを修正せずに実行 |
-p1:先頭のスラッシュまでを削除 | |
-pN:N個目のスラッシュまでを削除 | |
-d | 適用ディレクトリの指定 |
-R | 適用した逆順に実行(Rollback) |
Diffコマンドの書式
次にパッチファイルを作成するために実行する「Diffコマンド」の書式をまとめていきます。
#diff (ファイル1)(ファイル2)
このコマンドにもいくつかオプションがあるのでまとめておきます
オプション | 詳細 |
-c(–context) | 差分箇所が「!」で表示 |
-u(–unified) | 差分箇所が「+ -」表記 |
-I | 大文字/小文字の差分を無視 |
-B | 空行の無視 |

実践してみよう!
「patchコマンド」と「diffコマンド」の書式を頭に入れた後は、実機での確認を行いましょう。
今回は、「diff1.txt」と「diff2.txt」の2つのファイルを準備し、動作確認を行います。
hello world!
Today is Feb 12
hello world!
Today is Feb 13
Step1:パッチファイルの作成
「diffコマンド」によるパッチファイルの作成を行います。
daimaru@raspit:~ $ diff diff1.txt diff2.txt > diff.patch
上記コマンドを実行後、「diff.patch」の中身を確認すると以下が出力されます。
2c2
< Today is Feb 12
---
> Today is Feb 13
上記の内容は、「2c2」が行数、「<」が変更前、「>」が変更後の内容となります。
これでパッチファイルの作成は完了となります。
Step2:パッチの適用
パッチファイルの作成後は、「diff1.txt」に「diff.patch」の適用を行います。
今回は「パイプ」や「リダイレクト」は使わずに「Patchコマンド」で行います。
daimaru@raspi:~ $ patch diff1.txt diff.patch
patching file diff1.txt
上記の通り「patching file XXXX」と出力されたら無事にパッチ適用が完了しています。
Step3:更新後の確認
最後にStep2で適用した中身を確認しましょう!
daimaru@raspi:~ $ cat diff1.txt
hello world!
Today is Feb 13
最初は「Today is Feb 12」だったのが、「Today is Feb 13」に変更されています。
パッチ適用が成功していることがわかりますね。

最後に
今回はLPIC Level2の勉強の一環として、「Patchコマンド」について学んでみました。
引き続き合格を目指してインプットとアウトプットを繰り返していきたいと思います。