6.7. テキストファイルの差分とパッチ 【diff、patch】

$ diff[オプション]ファイル1 ファイル2

2つのファイルを比較して、行ごとの差分を表示したい場合には diff というコマンドを使用します。diff は、指定された ファイル1ファイル2 の内容を比較して、ファイル1 をどのように変更すれば ファイル2 と同じになるかという差分を出力します。

出力形式にはいくつかの種類がありますが、一般的には次のオプションとともに使用されます。

$ diff -urN test.txt.org test.txt
--- test.txt.org        Wed Apr 25 17:14:36 2001
+++ test.txt    Wed Apr 25 17:14:11 2001
@@ -1,7 +1,9 @@
-This is file1
+This is file2
 line1
 line2
 line3
 line4
+line5
+line6
 line7

-r オプションと -N オプションの意味は次の通りです。

表 6-3. diff コマンドのオプション

-u unified 出力形式を使用します。
-rディレクトリ単位の比較のときに、サブディレクトリも含めて比較します。
-Nディレクトリ単位の比較のときに、一方のディレクトリにしか存在しないファイルがある場合、もう一方のディレクトリには空のファイルがあるものとして扱います。

diff で作成した差分ファイルは patch というコマンドで適用することができます。上記の例でいうと、patch コマンドを実行することで、test.txt.orgtest.txt の両ファイルを同じ内容にすることができます。

例えば、以下のようにコマンドを実行します。

$ diff -urN test.txt.org test.txt > test.txt.diff
$ patch -p0 < test.txt.diff
patching file test.txt.org
$

patch コマンドのデフォルトの動作では、カレントディレクトリのファイルにパッチをあてようと試みます。サブディレクトリを含めて扱わせるためには -p オプションを指定します。

-p オプションのあとの数字は差分ファイルに記述されているパスの除去カウントの指定です。例えば、パッチを作成した人と異なるディレクトリにファイルを置いている場合などに差分ファイル中のパスをどのように解釈するかを指定するためのものです。除去カウントの数字は、パスの先頭から何個のスラッシュを除去するかを意味します。例えば、差分ファイル中のファイル名が /home/turbo/src/program.c と記述されている場合 -p や -p0 を指定すると、パスは全く変更されません。しかし、-p1 を指定すると、最初のスラッシュがない home/turbo/src/program.c となり、-p3 を指定すると src/program.c となります。また、-p を指定しなかった場合は program.c となります。