業務では、あるファイルに対する変更を、別のファイルにも適用する機会が多くあります。
こういった単純作業は、自動化して(パッチを当てて)一瞬で終わらせてしまいましょう。

ここでは、diffコマンドで作成したパッチを、patchコマンドで適用する方法を紹介します。


■パッチ(差分ファイル)を作成する

diff -ru [変更前ディレクトリ] [変更後ディレクトリ] > patch_work

解説:
変更前にディレクトリごとバックアップをとっておいたことを前提として、
ディレクトリ単位で差分patch_workに出力します。

rオプションは、サブディレクトリに含まれるファイルも再帰的に比較するために指定します。

uオプションは、差分をユニファイドdiff形式で出力するために指定します。

patch_workにリダイレクト(>)で出力していますが、ファイル名は何でも構いません。


■パッチを当てる

patch -u  -p 1 -d [パッチを当てるディレクトリ] < patch_work

解説:
uオプションはユニファイドdiff形式のパッチを当てる場合に指定します。

pオプションは、パッチファイルに記載されているファイルパスの階層を無視する数を指定します。

この例だと、-p 1と指定しているため、パッチファイルに記載されているファイルパスが
src_dir/test.txt と記載されている場合、1階層分のsrc_dirが無視され、
カレントディレクトリにあるtest.txtとしてpatchコマンドは認識します。

pオプションを指定する理由は、次のdオプションを使うためです。

dオプションの意味は、
「指定されたディレクトリへ移動してpatchコマンドを実行する」という意味です。

このように、pオプションとdオプションを組み合わせることで、
パッチに記載されているディレクトリ名と、パッチを当てたいディレクトリ名が異なる場合でも、パッチを当てることができます。
少しわかりにくいかもしれませんが、実際にコマンドを実行してみると理解できると思います。

patchコマンドを実行すると、SuccessやFailerなどの文字が出力されます。
これは、パッチが正しく「当たった」か、「当たらなかった」かを表しています。
パッチが「当たらなかった」時は、当たらなかったファイルの同階層に、
.rej拡張子のファイルが出力されます(ファイルの検索は目視ではなくfindコマンドを使用しましょう)。
このファイルに、当たらなかった差分が出力されているので、
手動でその差分を目的のファイルにマージしてください。

なお、パッチが「当たらない」場合とは、
パッチに記載されている差分の前後3行に一致する行が無かった場合か、
逆に一致する行が複数あってどこに当てるべきか判断できない場合などです。
対処として、パッチの作成時に前後の出力する行数をUオプションなどで調整したりします。


解説は以上です。
私の説明が下手でわかりにくいかもしれませんが、
たった2つのコマンドしか実行していません。

非常によく使う、強力なコマンドですので、
Linuxを使う方はぜひ活用し、作業を効率化しましょう。

スポンサードリンク