DIFF(1)

名称
diff - 2 つのテキストファイルの間の差を求める

書式
diff [options] from-file to-file

解説
diff の最も単純な使用方法は、 from-file と to-file の 2 つのファイルを指定することです。 この場合、 diff は、その 2 つのファイルの内容を比較します。ファイル名 として、`-' を指定した場合は、標準入力から読み込みを行ないます。 特殊な場合として、 diff - - は標準入力をそれ自身と比較します。

もし、 from-file としてディレクトリを指定し to-file がディレクトリでなかった場合、 diff は to-file で指定したファイル名と同じ名前のファイルを from-file のディレクトリから捜して、そのファイルとの間で比較を行ないます。 その逆に、 to-file がディレクトリで from-file がディレクトリでない場合も、同様に処理します。なお、 ディレクトリでない方のファイルに `-' を指定することはできません。

from_file と to_file の両方がディレクトリだった場合、 diff は、両方のディレクトリ内でファイル名が同じファイル同士をアルファベット順に 比較していきます。この時、 -r もしくは、 --recursive オプションが指定されていれば、 サブディレクトリの中のファイルも再帰的に比較していきます。 diff は、ディレクトリの実際の中身をファイルのように比較しません。標準入力は名前 が無く``同じ名前を持ったファイル''の概念が適用できないので、 完全指定したファイルは標準入力であってはなりません。

diff のオプションは - で始まります。よって通常 from_file と to_file は - で始まりません。しかしながらそれ自体が引数である -- の後では、 残された引数が - で始まっていてもファイル名として扱います。

  オプション
GNU diff のすべてのオプションの要約は以下の通りです。ほとんどのオプション は 2 つの同等な名前を持ちます。1 つは - で始まる 1 文字の名前で、もう 1 つは、 -- で始まる長い名前です。複数の 1 文字のオプション (引数を持たない場合) は、 1 つの文字列にまとめてしまって構いません。つまり -ac は -a -c と同等です。長い名前のオプションはその名前の接頭辞が一意的に決まればどんな 省略でもできます。鍵括弧 ([ と ]) は、オプションが省略可能な引数を持つことを示します。

-lines
    -c か -u と組み合わせて、相違点の前後 (context) の表示行数を `数字' で指定します。このオプションだけでは、出力フォーマットは変化しません。 このオプションは旧式 (obsolete) です。 patch をうまく働かせるためには、少なくとも前後 2 行ずつは必要です。

-a

--text
    テキストファイルでないようなものについても、全てのファイルを テキストとみなして、1 行づつ比較していきます。

-b

--ignore-space-change
    空白の数の違いを無視します。

-B

--ignore-blank-lines
    空行が入っているもしくは足りないなどの違いは無視します。

--brief

-q  ファイルの違いの詳細は表示せず、違っているかどうかだけを報告します。

-c  ``context output format'' を使用します。

-C 行数

--context[=行数]
    ``context output format'' を使用します。不一致の行の前後に、`行数' で指定した行数だけ表示します (context)。 patch をうまく働かせるためには、少なくとも 2 行の context が必要です。

--changed-group-format=format
    if-then-else 形式の両方のファイルから異なった行を含む部分を出力する ために format を使用します。 format 文字列に指定可能なものの詳細は、 diff の info 文書を参照してください。

-d

--minimal
    より小さな差分を見つけるアルゴリズムに変更します。このオプションを 指定すると diff の処理速度は遅くなります (かなり遅くなることもあります)。

-D name

--ifdef=name
    プリプロセッサマクロ name の条件記述を用いた if-then-else 形式にマージして出力します。

-e

--ed
    ed のスクリプトの形式で出力します。

--exclude=pattern

-x pattern
    ディレクトリ単位の比較の時、ファイルやディレクトリ名が pattern にマッチした場合は、比較しないようにします。

--exclude-from=file

-X file
    ディレクトリ単位の比較の時、ファイルやディレクトリ名が file の中に含まれるパターンにマッチした場合は、比較しないようにします。

--expand-tabs

-t  入力ファイルのタブによる位置調整をくずさないよう、タブを空白に展開します。

-f

--forward-ed
    ed のスクリプトと一見同じような出力をします。ただし、ファイルに 現われる順序が違います。

-F regexp

--show-function-line=regexp
    context diff 形式および unified diff 形式において、差分のブロック毎に、 差分のブロックに先行し、かつ regexp にマッチする行のうちでもっともブロックに近い行を出力します。

-h  なにも機能はありません。通常の UNIX の diff との互換のためにあります。

-H

--speed-large-files
    小さな違いがあちこちにあるような大きなファイルの処理を 高速化するヒューリスティックを用います。

--horizon-lines=lines
    2 つのファイルの先頭と末尾における共通部分のうち lines 行を残したままで差分を検索します

-i

--ignore-case
    英大文字と小文字の違いを無視します。

-I regexp

--ignore-matching-lines=regexp
    正規表現 regexp にマッチした行が追加あるいは削除されていても無視します。

--initial-tab

-T  通常形式および context diff 形式において、テキスト先頭に空白文字ではなく タブを入れます。行に含まれるタブが元と同じような形で見えます。

-l

--paginate
    出力を pr に通してページ付けを行ないます。

-L label

--label=label
    context diff 形式および unified diff 形式において、 出力に付加されるファイル名の代わりに、 label で指定したラベルを使用します。

--left-column
    2 段組形式において、2 つの共通の行の左の欄だけを表示します。

--line-format=format
    format を用いて、すべての入力行を if-then-else 形式で出力します。

-n

--rcs
    RCS形式の差分を出力します。 -f と似ていますが、各コマンドには適用した行数がついた形となります。

-N

--new-file
    ディレクトリ単位の比較の時に、片方のディレクトリにだけ存在するファイルに 関しては、他のディレクトリでは空のファイルがあるものとして扱います。

--new-group-format=format
    2 番目のファイルにだけ存在する部分をif-then-else 形式で出力するために format を使います。

--new-line-format=format
    if-then-else 形式で 2 番目のファイルにだけ存在する行を出力するために使う format

-o  古い伝統的な出力フォーマットを使う

--old-group-format=format
    if-then-else 形式で 1 番目のファイルにだけ存在する部分を出力するために使う format

--old-line-format=format####
    if-then-else 形式で 1 番目のファイルにだけ存在する行を出力するために使う format

-p  各変更が含まれる C の関数を表示します。

-P

--unidirectional-new-file
    ディレクトリの比較において、2 番目のディレクトリにしか存在しないファイル があれば、1 番目のディレクトリにもサイズ 0 のファイルがあるとみなします。

-r

--recursive
    ディレクトリ単位の比較の時に、サブディレクトリがあれば、その配下も再帰的に 検索して比較を行ないます。

--report-identical-files

-s  ファイルの内容が同じだった時に、その旨を報告します。

-S file

--starting-file=file
    ディレクトリ単位の比較の時に、 file で指定したファイル名から実行します。これは、一連の比較作業を中断した後に 途中から再開するのに便利です。

--sdiff-merge-assist
    sdiff 作業の手助けになる補足の情報を表示します。普通、 sdiff が diff を実行する際にはこのオプションを付けるので、 ユーザが直接このオプションを使うことはありません。

--show-c-function
    C のプログラムを認識して、どの関数で変更があったかを表示します。

--side-by-side

-y  比較する 2 つのファイルの内容を、横に並べて表示します (side-by-side 形式)。

--suppress-common-lines
    side-by-side 形式の表示で、同じ内容の行は表示しないようにします。

-u  unified diff 形式を用います。

--unchanged-group-format=format
    if-then-else 形式で変更がなかった部分を出力するために使う format

--unchanged-line-format=format
    if-then-else 形式で変更がなかった行を出力するために使う format

-U 行数

--unified[=行数]
    unified diff 形式にします。不一致の行の前後に、`行数' で 指定した行数のマッチした行も表示します。`行数' を省略した場合は 3 行になります。 patch をうまく働かせるためには、少なくとも前後 2 行は必要です。

-v

--version
    diff のバージョンを表示します。

-w

--ignore-all-space
    比較時に、水平方向の空白は無視するようにします。

-W columns

--width=columns
    side-by-side 形式の表示で、1 行の幅を columns で指定した文字数にします。

戻り値
ファイルが同一の場合、 diff は 0 を返し、異なる場合 1 を返します。 ファイルのいずれか一方 (あるいは両方とも) オープンできない場合、 戻り値に 2 が設定されます。

環境変数
環境変数 DIFF_OPTIONS は diff のデフォルトオプションの組を保持可能です。 これらのオプションは最初に解釈され、 明示的なコマンド行パラメータにより上書きされます。

使用例
ローカルソースツリーに対して行った変更 (新規ファイルを含み得る) をファイルに保存し、(おそらく send-pr(1) プログラムを使用して) 他人に見せられるようにするには、

diff -crN foo.orig foo >foo.diff

と打ち込みます。 ここで、 foo.orig と foo は、ディレクトリ階層であってもかまいませんし、 単一ファイルであってもかまいません。

関連項目
cmp(1), comm(1), diff3(1), ed(1), patch(1), pr(1), sdiff(1)

戻り値
比較結果として、違いが無かった場合は 0 を、違いが発見された場合は 1 を、 何かエラーがおきた場合は 2 を返します。