patchコマンドでファイルを差分適用する方法|--dry-runで安全確認とロールバックも

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > patchコマンドでファイルを差分適用する方法|--dry-runで安全確認とロールバックも
「設定ファイルを修正したパッチを別サーバーに適用したいが、どうすればいい?」
「diffコマンドで出力したファイルをそのまま使えないのか?」

Linuxのpatchコマンドは、diffコマンドが出力した差分ファイル(パッチファイル)を使って、対象ファイルに変更を一括適用するコマンドです。
手動でファイルを書き換えるよりも、確実に・素早く・安全に変更を適用できます。

この記事では、patchコマンドの基本的な使い方から、--dry-runによる事前確認、-pオプションのパス調整、複数ファイルへのパッチ適用まで、現場で必要な実践知識をまとめて解説します。
実行環境はRHEL 9.4 / Rocky Linux 9で動作確認しています。

この記事のポイント

・patch コマンドは diff 出力を使ってファイルを自動更新できる
・--dry-run オプションで適用前に問題がないか確認できる
・-p オプションでパッチ内のパス階層を調整して適用する
・-R オプションで適用済みパッチを元に戻せる(ロールバック)


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

patchコマンドとdiffコマンドの関係

patchコマンドは、diffコマンドが生成した差分ファイル(パッチファイル)を読み込み、指定したファイルにその差分を適用するコマンドです。

Linuxのシステム管理では、以下の場面でよく使います。
・サーバーAで修正した設定ファイルを、サーバーBにも同じ変更を適用したい
・ソフトウェアのソースコードに特定の修正を当てたい(バグ修正パッチなど)
・変更箇所だけを正確に共有して、チームメンバーに適用させたい

diffコマンドとpatchコマンドはセットで覚えておくと、複数サーバーへの設定変更展開や、ソースコードへのパッチ当てが格段に効率化されます。

参考:Linux 基本コマンドの解説

1. diffコマンドでパッチファイルを作る

まず、変更前と変更後のファイルからパッチファイルを作成します。

# 書式: diff -u 変更前ファイル 変更後ファイル > パッチファイル名 $ diff -u httpd.conf.orig httpd.conf > httpd.conf.patch

-uオプション(unified形式)を付けることで、patchコマンドが解釈しやすい形式でパッチファイルが出力されます。

2. パッチファイルの中身を確認する

$ cat httpd.conf.patch --- httpd.conf.orig 2024-10-01 10:00:00.000000000 +0900 +++ httpd.conf 2024-10-01 10:30:00.000000000 +0900 @@ -42,7 +42,7 @@ # Timeout: The number of seconds before receives and sends time out. # -Timeout 60 +Timeout 120

「---」が変更前ファイル、「+++」が変更後ファイルです。「-」で始まる行が削除、「+」で始まる行が追加を意味します。

patchコマンドの基本的な使い方

1. 単一ファイルへのパッチ適用

# 書式: patch 対象ファイル < パッチファイル $ patch httpd.conf < httpd.conf.patch patching file httpd.conf

「patching file httpd.conf」と表示されれば適用成功です。

2. -iオプションでパッチファイルを指定する

リダイレクト(<)の代わりに、-iオプションでパッチファイルを指定することもできます。

$ patch -i httpd.conf.patch httpd.conf patching file httpd.conf

3. バックアップを作成してから適用する(-bオプション)

-bオプションを付けると、適用前のファイルを「.orig」拡張子で自動バックアップします。本番環境では必ず使う習慣をつけてください。

$ patch -b -i httpd.conf.patch httpd.conf patching file httpd.conf # バックアップが作成されたことを確認 $ ls -l httpd.conf* -rw-r--r--. 1 root root 11748 Oct 1 10:30 httpd.conf -rw-r--r--. 1 root root 11748 Oct 1 10:00 httpd.conf.orig

バックアップファイル(.orig)があれば、万が一問題が起きたときに即座に元に戻せます。

--dry-runで事前に安全確認する

本番ファイルに直接パッチを当てる前に、--dry-runオプションで問題がないか確認する習慣をつけてください。
実際には変更を適用せず、適用した場合の結果だけを表示してくれます。

1. --dry-runの使い方

# --dry-runで事前確認(実際にはファイルを書き換えない) $ patch --dry-run -i httpd.conf.patch httpd.conf patching file httpd.conf (dry run)

「(dry run)」と表示されれば問題なく適用できる状態です。エラーが出た場合は、-pオプションなどでパスを調整する必要があります。

2. --dry-runでエラーになる場合

$ patch --dry-run -i httpd.conf.patch httpd.conf can't find file to patch at input line 3 Perhaps you used the wrong -p or --strip option? The text leading up to this: -------------------------- |--- a/etc/httpd/conf/httpd.conf |+++ b/etc/httpd/conf/httpd.conf --------------------------

このエラーはパッチファイル内のパスが、現在のディレクトリから見た対象ファイルのパスと一致しない場合に発生します。次のセクションで解説する-pオプションで解決します。

-pオプションでパス階層を調整する

patchコマンドを使う際に最も混乱しやすいのが、-pオプション(--strip)です。
パッチファイル内に記載されているパス(a/etc/httpd/conf/httpd.conf など)の先頭から何段階のディレクトリを取り除くかを指定します。

1. -pオプションの仕組み

パッチファイルの中身のパスが以下の場合:

--- a/etc/httpd/conf/httpd.conf +++ b/etc/httpd/conf/httpd.conf

-p0 なら「a/etc/httpd/conf/httpd.conf」をそのまま使用します。
-p1 なら「etc/httpd/conf/httpd.conf」(先頭の「a/」を除去)となります。
-p2 なら「httpd/conf/httpd.conf」(先頭の「a/etc/」を除去)となります。

gitのdiffで作成したパッチでは、パスが「a/」「b/」で始まるため、-p1がデフォルトとしてよく使われます。

2. -p1を指定した実行例

# gitのdiffで作ったパッチに -p1 を指定する $ patch -p1 -i feature.patch patching file src/main.c patching file include/header.h

3. ディレクトリを指定して適用する(-dオプション)

-dオプションで、パッチを適用するベースディレクトリを指定できます。

# /etc/httpd ディレクトリを基点として適用する $ patch -d /etc/httpd -p1 -i /tmp/httpd.patch patching file conf/httpd.conf

パッチを元に戻す(-Rオプション)

-Rオプション(--reverse)を使うと、適用済みのパッチをロールバック(元に戻す)できます。
誤ったパッチを適用してしまった場合の切り戻しや、バックアップファイルがない場合の復旧に使えます。

1. パッチのロールバック手順

# 適用したパッチを元に戻す $ patch -R -i httpd.conf.patch httpd.conf patching file httpd.conf

2. ロールバック前に--dry-runで確認する

# --dry-runでロールバックの事前確認 $ patch -R --dry-run -i httpd.conf.patch httpd.conf patching file httpd.conf (dry run)

問題なければ --dry-run を外して実際にロールバックします。

複数ファイルへのパッチ適用(ディレクトリ全体)

1. diff -rでディレクトリ差分を作る

# ディレクトリ全体の差分をパッチファイルに出力する $ diff -ru conf.orig/ conf/ > conf.patch

-rオプションでディレクトリを再帰的に比較します。-uはunified形式(patchが解釈できる形式)です。

2. ディレクトリへの一括パッチ適用

# ディレクトリ全体に一括でパッチを適用する $ patch -p0 -i conf.patch patching file conf/httpd.conf patching file conf/ssl.conf patching file conf.d/virtual.conf

複数サーバーへ同じ設定変更を展開する際に特に便利な手法です。
Linuxのファイルシステムとマウントの基礎については、mount コマンドの使い方も参考にしてください。

主要オプション早見表

やりたいこと コマンド
パッチをファイルに適用する patch 対象ファイル < パッチファイル
-iでパッチファイルを指定する patch -i パッチファイル 対象ファイル
適用前にバックアップを作る patch -b -i パッチファイル 対象ファイル
適用前に問題がないか確認する patch --dry-run -i パッチファイル 対象ファイル
パスの先頭1階層を除去して適用する patch -p1 -i パッチファイル
パッチを元に戻す(ロールバック) patch -R -i パッチファイル 対象ファイル
ベースディレクトリを指定して適用する patch -d ディレクトリ -p1 -i パッチファイル
ディレクトリ全体にパッチを適用する patch -p0 -i ディレクトリ差分パッチ

トラブルシュート・エラー対処

「Hunk FAILED」エラーが出た場合

$ patch -i httpd.conf.patch httpd.conf patching file httpd.conf Hunk #1 FAILED at 42. 1 out of 1 hunk FAILED -- saving rejects to file httpd.conf.rej

「Hunk FAILED」は、パッチが対象ファイルの内容と一致しなかった場合に発生します。主な原因と対処法は以下の通りです。

対象ファイルが既に変更されている:パッチが変更前のファイルを想定しているのに、既に別の変更が入っている場合
ファイルが別バージョン:パッチを作成した時と異なるバージョンのファイルに適用しようとしている場合
対処法:.rejファイルに適用できなかった差分が保存されるので、手動でその内容を確認して修正します

「can't find file to patch」エラーが出た場合

$ patch -i httpd.conf.patch can't find file to patch at input line 3

パッチファイル内のパスが、現在の実行ディレクトリから見たファイルの場所と一致しないエラーです。
-pオプションの数値を変えて試すか、-dオプションでベースディレクトリを正しく指定してください。

「Only garbage was found in the patch input」エラーが出た場合

パッチファイルがunified形式でない場合(diffコマンドに-uオプションを付け忘れた場合)に発生します。
diffコマンドで -u オプションを付けてパッチファイルを作り直してください。

FAQ(よくある質問)

Q. patchコマンドはどのLinuxディストリビューションでも使えますか?

ほぼ全てのLinuxディストリビューションで標準インストールされています。インストールされていない場合は、RHEL/Rocky Linuxなら dnf install patch、Ubuntuなら apt install patch でインストールできます。

Q. バイナリファイルにもpatchコマンドは使えますか?

標準のpatchコマンドはテキストファイル専用です。バイナリファイルの差分にはbspatchコマンド(bsdiffパッケージ)を使います。Linuxのカーネルモジュールへのパッチなど、特殊なユースケースで使われます。

Q. パッチの適用に失敗した場合、ファイルはどうなりますか?

patchコマンドは、適用に失敗した場合でも部分的に変更が加わっている可能性があります。-bオプションでバックアップを取っていれば「.orig」ファイルに戻せます。バックアップがない場合は、.rejファイルを参照して手動で修正するか、Gitで管理しているなら git checkout で元に戻せます。

Q. --dry-runと-Rはどう使い分けますか?

--dry-runは「適用前の動作確認」で、実際にはファイルを変更しません。-Rは「既に適用済みのパッチを元に戻す」ロールバック操作です。本番適用の前は必ず--dry-runで確認し、問題があれば適用後に-Rでロールバックするという流れが基本です。

Q. gitで管理しているプロジェクトのパッチはどう作ればいいですか?

gitの場合は git diffgit format-patch でパッチを作成します。git format-patch で作成したパッチは git am で適用するのが一般的ですが、patchコマンドでも -p1 を付ければ適用できます。

まとめ

patchコマンドは、diffコマンドと組み合わせることでサーバー間の設定変更やソースコードの修正を安全かつ確実に適用できます。
場面 推奨オプション 理由
本番適用前の確認 patch --dry-run -i パッチファイル 対象ファイル 実際には変更せず適用可否を確認できる
バックアップ付き適用 patch -b -i パッチファイル 対象ファイル .origファイルが自動生成されロールバックが容易
gitのdiffを使ったパッチ patch -p1 -i パッチファイル a/b/プレフィックスを除去して正しいパスに変換
適用したパッチを元に戻す patch -R -i パッチファイル 対象ファイル パッチを逆向きに適用してロールバックできる

patchコマンドを使いこなすには、まずdiff -uでパッチファイルを正しく作成することが前提です。
また、本番環境では必ず --dry-run で事前確認してから適用する習慣を身に付けてください。

Linuxの基本的なファイル操作コマンドの一覧は、Linux 基本コマンドの解説にまとめています。
ファイルシステムのマウントや管理については、mount コマンドの使い方も合わせて参照してください。

patchコマンドも、現場での「使いどころ」がわかっていますか?

設定ファイルの差分管理や複数サーバーへの変更展開は、サーバー運用の現場で日常的に発生する作業です。patchコマンドの使い方を覚えても、本番環境でどのタイミングで使うべきか、エラー時にどう対処するかを即座に判断するには、Linuxの仕組みを体系的に理解しておく必要があります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。