patch - ファイルにパッチファイルを適用する

patch

patchコマンドは、diffコマンドで作成したパッチファイルをファイルに適用します。

パッチファイルは、一つのファイルに適用することもできますが、パッチファイルの内容の形式によっては、ディレクトリにあるファイルごとパッチを適用できます。

スポンサーリンク

patchコマンドの基本的な構文

patchコマンドの基本的な構文

patchコマンドはパッチファイルを標準入力から読み込むことができます。その場合、リダイレクト等が利用できます。

diffコマンドで作成できるpatchファイルの形式

patchコマンドで使用できるパッチファイルで利用できる形式には様々な形式があります。ここでは、diffコマンドで出力をファイルに保存して、patchコマンドを利用します。diffコマンドで出力される形式は主に以下のような形式があります。

normal形式の例

context形式の例

unified形式の例

patchコマンドを利用する場合、normal形式のパッチファイルにはファイル名の情報がないため、パッチを適用するためにはファイルを指定する必要があります。

context形式やunified形式にはファイル名の情報があるため、パッチファイルを読み込むことでパッチをファイルに適用することもできます。

patchコマンドの利用例

ファイルにパッチを適用

patchコマンドでファイルとパッチファイルを指定することで、そのファイルがパッチファイルを適用できる場合、そのファイルの内容が書き換わります。

また、ファイルの内容は書き換えられるため、バックアップがほしい場合は-bオプションを利用することで、バックアップを作成した後にファイルにパッチを適用できます。

oldfile.c

newfile.c

cfile_normal.patch(diffコマンドの出力)

コマンド例と実行結果

unified形式等ファイル情報があるパッチファイルの場合、パッチファイルをpatchコマンドへ標準入力から読み込ませることで、そのファイルパスを読み込んでパッチを適用することができます。

cfile_unified.patch

コマンド例と実行結果

また、ファイル情報のあるunified形式等のパッチファイルは、normal形式のパッチファイルと同じようにファイルを指定して、パッチを適用することもできます。

コマンド例と実行結果

パッチを適用できるか確認
(--dry-runオプション)

--dry-runオプションを利用すると、パッチを適用する前にファイルにパッチを適用することができるかを確認できます。

コマンド例と実行結果

失敗する場合は、エラーメッセージが表示されます。

コマンド例と実行結果

バックアップを作成
(-bオプション)

-bオプションを用いると、パッチを適用する前にファイルのバックアップを作成できます。デフォルトのバックアップファイルの名前は元のファイル名に接尾辞として基本的に.origがつきます。

コマンド例と実行結果

-bオプションに対して、-zオプションを追加するとバックアップファイルの接尾辞を変更できます。

コマンド例と実行結果

-Bオプションを利用すると指定しているファイル名の始めに文字をつけることができます。また、-Bオプションは保存するディレクトリを指定することもできます。

コマンド例と実行結果(ファイル名の始めに文字をつける)

コマンド例と実行結果(保存するディレクトリを指定)

引数のファイル名にディレクトリ部分がある場合、ファイル名の部分から接頭辞をつけたい場合は-Yオプションを用いることで付けることができます。
下のコマンド例では、-Yオプションと-Bオプションでbackupというディレクトリを作成しバックアップファイルを保存しています。
また、-Rオプションはパッチを戻すオプションになります。
コマンド例と実行結果

ディレクトリにあるそれぞれのファイルに対してパッチを適用
(-pオプションと-dオプション)

ディレクトリに対して、パッチを適用する場合は-pオプションが重要になります。

-pオプションは数字を指定して、指定した数字の分だけパッチファイルでのファイルパスにあるディレクトリの部分を削除できます。

パッチファイルで適用するファイルが'v1/point.txt'のようなファイルパスの場合、-p0オプションを指定すると'v1/point.txt'のファイルに対して、パッチを適用します。

-p1オプションを指定すると'point.txt'というファイルに対して、パッチを適用します。

-pオプションを指定しない場合は、全てのディレクトリ部分を除いた、ファイル名の部分だけのファイル('v1/point.txt'ならば、'point.txt'のファイル)に対して、パッチを適用します。

v1のディレクトリ(パッチを適用するディレクトリ)

v1_dir.patch

コマンド例と実行結果

シンボリックリンクファイルに対して、--follow-symlinksオプションを指定していない場合は、シンボリック先のファイルに対してパッチを適用することはできません。

パッチを適用できなかった場合はreject fileが作成されます。reject fileはパッチを適用できなかったところのパッチが出力されます。また、reject fileのデフォルトの拡張子は.rejになります。
reject fileの内容例

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

コマンド例と実行結果

パッチが適用済みのファイルを無視
(-Nオプション)

-Nオプションはパッチファイルがすでに適用済みのファイルやパッチを逆に適用するファイルを無視します。

ここでは、パッチをディレクトリに適用するときに--follow-symlinksをつけ忘れたものに再びパッチを適用しています。

コマンド例と実行結果

パッチファイルを指定
(-iオプション)

-iオプションは適用するパッチファイルを指定することができます。-iオプションが指定されていない場合は、標準入力からパッチファイルを読み込むことができます。

コマンド例と実行結果

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

-Rオプションは、パッチを適用したファイルを戻すときやdiffコマンドで引数を逆にして作成してしまったパッチファイルを適用する場合に利用できます。

oldfile.c(パッチ適用済み)

コマンド例と実行結果

参考

GNU diffutils - Comparing and Merging Files