diff - ファイルの差異の表示


Table of Contents

diff コマンドで 2つのファイルの差異を調べることができます。

% diff [file1] [file2]

のようにします。 演習の採点作業の時に他の人のコピーか否かを調べるときに使用したりもします。 標準入力から受け取りたいときは、

% [command] | diff - [file]

のように - で指定できます。それでも1つは必ずファイルが必要です。

引数の両方にディレクトリ名を指定した場合は、2つのディレクトリ以下に存在するファイルの差分を表示します。

% diff [dir1] [dir2]

ただし、片方のディレクトリにしか存在しないファイルの差異は表示しません。 同一名のファイルのみを比べます。

% diff -r [dir1] [dir2]

のように -r オプションを使えば ディレクトリを再起的にたどって比較します。

パッチ Edit

また、パッチを作成するときにも diff コマンドを使用します。

% /usr/local/bin/diff -u [file1] [file2] > [patch_file]

のように -u オプションを指定します。/usr/bin/diff にはありませんでした。 オプション -u を指定すると unified 形式となり、通常は

1c1
< test
---
> ttest

のように表示されていたのが、

--- [file1]        Tue Oct  7 03:06:46 2003
+++ [file2]        Tue Oct  7 03:06:53 2003
@@ -1 +1 @@
-test
+ttest

のように表示されます。[file1] を [file2] にするにはどのような差異があるかが表示されます。 パッチをあてるには

% patch < [patch_file]

と実行します。file1 の内容が file2 の内容になります。 このときパッチファイルに記述されたパス名でパッチをあてるので、 今回の場合は file1 がカレントディレクトリに存在していなければいけません。 配布されたパッチファイルを実行するときはそこに注意しましょう。

ディレクトリを再帰的にたどり、差異をまとめて1つパッチファイルを作成することもできます。

% diff -ur Project/ Project2/ > patch.diff
--- [Project/file]        Tue Oct  7 03:06:46 2003
+++ [Project2/file]        Tue Oct  7 03:06:53 2003
% ls
Project/
% patch -p0 < patch.diff

ディレクトリ以下を対象とされているときは -p オプションを使用して パッチのあてられるディレクトリの位置を調整します。

% diff -u orig/Project/ modified/Project/ > patch.diff
--- [orig/Project/file]        Tue Oct  7 03:06:46 2003
+++ [modified/Project/file]        Tue Oct  7 03:06:53 2003
% ls
orig/
% patch -p0 < patch.diff

% ls
Project/
% patch -p1 < patch.diff

p1 オプションで orig/ を削り、Project/... とアクセスできます。 配布者が orig ディレクトリを利用していても、 パッチユーザーが orig ディレクトリを作る必要はないということになります。 p2, p3 ... と削る数を増やせます。

オプション一覧 Edit

以下 diff オプション

-ccontext diff 形式の出力をする。
-uunified diff 形式の出力をする。
-eed diff 形式の出力をする。
-rディレクトリを比較したとき、その下のサブディレクトリを再帰的にたどっていく。
-aテキストファイルとして比較する。
-y2つのファイルを、横に並べて表示する。
-b, --ignore-space-change空白・タブの数の違いを無視する。
-i, --ignore-case大文字・小文字の違いを無視する。
-w, --ignore-all-space行を比較するときスペースを無視する。
-B, --ignore-blank-lines空行のある・なしの違いを無視する。
-E, --ignore-tab-expansionタブ展開によるスペースの変更を無視する
-I [REGEXP], --ignore-matching-lines=[REGEXP]REGEXP にマッチする行を無視する
--strip-trailing-cr改行コードの違いを無視する

xrea