diff コマンド

目的

テキスト・ファイルを比較します。

構文

2 つのファイルの内容を比較する

diff [ -c| -C Lines | -D [ String ] | -e | -f | -n | -u | -U Lines ] [ -b ] [ -i ] [ -t ] [ -w ] File1 File2

diff [ -h ] [ -b ] File1 File2

ディレクトリーの内容をソートし、相違点のあるファイルを比較する

diff [ -c | -C Lines | -e | -f | -n | -u | -U Lines ] [ -b ] [ -i ] [ -l ] [ -r ] [ -s ] [ -S File ] [ -t ] [ -w ] Directory1 Directory2

diff [ -h ] [ -b ] Directory1 Directory2

説明

diff コマンドはテキスト・ファイルを比較します。 このコマンドは、ファイルまたはディレクトリーの内容を比較することができます。
注: diff コマンドは、 入力ファイルがテキスト・ファイルである場合のみ機能します。

Directory1Directory2 の両パラメーターを指定すると、diff コマンドは両方のディレクトリー内の同じ名前を持つテキスト・ファイルを比較します。異なっているバイナリー・ファイル、共通サブディレクトリー、およびどちらか 1 つのディレクトリーのみにあるファイルが出力されます。

diff コマンドが通常のファイルに対して実行されている場合で、 ディレクトリーの比較の際に異なるテキスト・ファイルを比較した場合、diff コマンドは 両者が一致するには、ファイル内のどの行を変更しなければならないかを 知らせます。File1 パラメーター または File2 パラメーターのどちらもディレクトリーでない場合は、 どちらかに - (ハイフン) を指定して、標準入力を 使用することができます。File1 パラメーターがディレクトリーである場合、 そのディレクトリー内では、File2 パラメーターと同じファイル名のファイルが使用されます。

典型的な出力には、次のようなフォーマットの行が含まれます。

Lines Affected in File1   Action        Lines Affected in File2
Number1                   a             Number2[,Number3]
Number1[,Number2]         d             Number3
Number1[,Number2]         c             Number3[,Number4] 

上記の行は、File1File2 に変換するための ed サブコマンドに似ています。 アクション文字の前の番号は File1 に属し、アクション文字の後の番号は File2 に属します。 したがって、ad と入れ換えて右から左へ読むと、File2File1 に変換する方法も分かります。 ed コマンドのように、同一の組み合わせ (この場合は Number1 = Number2) は、1 つの番号として略記されます。

diff コマンドは、上記の各行に続けて、先頭に <: (より小の記号とコロン) を付けて、最初のファイル内で影響を受ける行すべてを表示し、その次に 2 番目のファイル内で影響を受ける行を、先頭に > (より大) を付けて表示します。

終了値 0 は相違がなかったことを、1 は相違が見つかったことを意味し、2 はエラーを意味します。

注: -c-C-D-e-f-n-u、または -U のフラグのうち 2 つ以上を指定した場合は、コマンド・ラインの最後のフラグが優先されます。エラー・メッセージは表示されません。

フラグ

項目 説明
-b 行の終わりのホワイト・スペースはその長さに関係なく単一改行文字として処理され (改行文字の前にあるホワイト・スペースは無視されます)、改行文字を含まないホワイト・スペース文字の他の文字列は等しく比較されるようにします。
-C Lines Lines 変数で指定された値と等しいコピー済みコンテキストの行数との diff コマンドによる比較を生成します。-C フラグは出力を若干変更します。出力は、関係するファイルの ID とファイルの作成日で始まります。 各変更は、12 個の * (アスタリスク) からなる 1 つの行で分離されます。File1 から除去された行には、- (負符号) のマークが付けられ、File2 に追加された行には、+ (正符号) のマークが付けられます。 一方のファイルからもう一方のファイルに変更された行は、 両方のファイルで ! (感嘆符) が表示されます。相互の指定されたコピー済みコンテキスト行内にある変更については、グループ化されて出力されます。
-c 3 行のコピー済みコンテキストとの diff コマンドによる比較を生成します。 -c フラグは出力を若干変更します。出力は、関係するファイルの ID とファイルの作成日で始まります。 各変更は、12 個の * (アスタリスク) からなる 1 つの行で分離されます。File1 から除去された行には、- (負符号) のマークが付けられ、File2 に追加された行には、+ (正符号) のマークが付けられます。一方のファイルからもう一方のファイルに変更された行は、 両方のファイルで ! (感嘆符) が表示されます。相互の指定されたコピーのコンテキスト行内での変更内容は、グループ化されて出力されます。
-D [String ] diff コマンドに、標準出力上で File1File2 を組み合わせたバージョンを作成させます。 C プリプロセッサー制御が含まれ、これにより String を定義しないで結果をコンパイルすることは File1 をコンパイルすることと等価になります。String を定義すると File2 になります。
-e ed エディターを使って File1File2 に変換するのに適したフォーマットで出力を行います。 このフラグを使用すると、次のシェル・プログラムによって、ファイルの複数のバージョンの保守を簡易化します。 必要なのは、発生源ファイル ($1) と、diff コマンドによって作成された一連のバージョン間 ed スクリプト ($2, $3, ...) だけです。最新バージョンは標準出力に表示されます。
(shift; cat $*; echo '1,$p') | ed - $1
-e フラグがディレクトリーの比較に使用される場合は、 追加のコマンドが出力に追加されます。したがって、 結果は、2 つのディレクトリーに共通するテキスト・ファイルを Directory1 での 状態から Directory2 での状態へ変換するためのシェル・スクリプトになります。
注: -e または -f フラグによって作成されたスクリプトを編集しても、 . (ピリオド) 1 つだけの行は作成できません。
-f ed エディターの使用に適さないフォーマットで出力を行わせ、-e フラグ指定時の出力とは逆の順序で、File1File2 に変換するのに必要な変更を表示します。
-h 変更されたセクションが短く、正しく区切られている場合に、より速くなる可能性がある代替比較を実行します。-h フラグはどのような長さのファイルでも動作します。-c-C-D-e-f、および -n の各フラグは -h フラグと一緒には使用できません。-b フラグを除く他のフラグはすべて、-h フラグと一緒に使用した場合、無視されます。
-i 大文字と小文字の区別を無視します。例えば、小文字の a は、 大文字の A と同じものとして扱われます。
-l 長い出力フォーマット。diff コマンドのテキスト・ファイルの比較結果はそれぞれ、pr コマンドにパイプ接続され、伝搬されます。 テキスト・ファイルの相違がすべて報告されてから、他の相違が記憶され、要約されます。
-n -e フラグの出力と類似した出力を生成しますが、順序は逆で、個々の挿入または削除コマンドで変更された行の数を伴います。これは、リビジョン・コントロール・システム (RCS) によって使用されるフォーマットです。
-r よく出てくるサブディレクトリーに diff コマンドを再帰的に適用します。
-s ファイルが同じである場合は報告します。同じでない場合は、報告しません。
-S [ File ] ディレクトリーの比較を行うときに、File 変数によって指定されたファイルの前にあるファイル名を無視します。-S フラグは Directory1 パラメーターと Directory2 パラメーターで指定されたディレクトリーだけに適用されます。-r フラグを -S フラグと一緒に指定すると、-S フラグは、Directory1 サブディレクトリーと Directory2 サブディレクトリーで再帰的に機能しません。
-t 出力行のタブを拡張します。典型的な出力または -c フラグ出力は、 各行の先頭に文字を追加します。これは、元のソース行のインデントに影響を与える場合があり、 出力リストの解釈を難しくする場合があります。このフラグは元のソースのインデントを保持します。
-u 3 行の統合されたコンテキストとの diff コマンドによる比較を生成します。

この出力は -c フラグの出力と似ていますが、コンテキスト行は繰り返されません。その代わりに、コンテキスト行、削除された行、および追加された行が混ざり合って表示されます。

-U Lines Lines 変数で指定された値と等しい統合されたコンテキストの行数との diff コマンドによる比較を生成します。この出力は -C フラグの出力と似ていますが、コンテキスト行は繰り返されません。その代わりに、コンテキスト行、削除された行、および追加された行が混ざり合って表示されます。
-w スペースとタブ文字をすべて無視します。 その他のブランク文字列もすべてブランク文字がないものと同様に扱います。例えば、if ( a == b ) は、 if(a==b) と同じです。

終了状況

このコマンドは次の終了値を戻します。

項目 説明
0 相違は見つかりませんでした。
1 相違が見つかりました。
>1 エラーが発生しました。

  1. 2 つのファイルを比較するには、次のように入力します。
    diff chap1.back chap1
    これによって、chap1.bak ファイルと chap1 ファイルとの相違が表示されます。
  2. ホワイト・スペースの量の違いを無視して 2 つのファイルを比較するには、 次のように入力します。

    diff  -w prog.c.bak prog.c
    2 つの行の相違がワード間のスペースとタブの数だけである場合、diff -w コマンドはその 2 つの行を同じであると判断します。
  3. ed コマンドが、あるファイルを別のファイルから再構成するのに使用できるコマンドの入ったファイルを作成するには、次のように入力します。
    diff  -e chap2 chap2.old >new.to.old.ed
    これによって new.to.old.ed という名前のファイルが作成されます。 このファイルには、chap2 を、 chap2.old でのテキストのバージョンに戻す、 ed サブコマンドが入っています。ほとんどの場合、new.to.old.ed は、 chap2.old よりもはるかに小さいファイルです。chap2.old を削除すると、ディスク・スペースを節約することができます。次のコマンドを入力すると、いつでも chap2.old を再構成することができます。
    (cat new.to.old.ed ; echo '1,$p') | ed - chap2 >chap2.old
    括弧内のコマンドは、ed エディターに送られる編集コマンドの終わりに、 1,$p を追加します。1,$p によって、ed コマンドは編集後に、標準出力にファイルを書き出すようになります。そして、この変更されたコマンド・シーケンスは ed コマンド (| ed) に送られ、エディターはそれを標準入力として読み取ります。- フラグは、 ed コマンドがファイル・サイズおよびその他の追加情報を表示しないようにします (chap2.old のテキストと混合されてしまうため)。

ファイル

項目 説明
/usr/bin/diff diff コマンドが入っています。