二つのファイル間の差を考えるときいくつかの方法があります.差を考えるとき の一つの方法は,別のファイルを生成するために,まとまった行があるファイル から削除,挿入,または変更されているということです.@command{diff}は行単 位で二つのファイルを比較し,異なっている行のまとまりを探し,そして,異なっ ているそれぞれのまとまりを報告します.目的によって,いくつかの書式で異なっ ている行を報告させることが可能です.
GNU @command{diff}では,詳細な差異を用いずにファイルが異なっている かどうかを表示することが可能です.それは,重要ではない差異の表示を抑制す る方法も提供しています.最も一般的なこととして,そのような差は単語や行の 間の空白の数が変更されているものです.@command{diff}は,アルファベットの 大文字小文字の差や,提供されている正規表現にマッチする行の差の表示を抑制 する方法も提供しています.これらのオプションは累積されます.例えば,空白 とアルファベットの大文字小文字の変更を無視することが可能です.
二つのファイルの差を考えるもう一つの方法として,バイトの集合が同一または 異なっているというのもがあります.@command{cmp}は二つのファイル間の差を, 行単位ではなく,バイト単位で報告します.結果として,バイナリファイルに対 して@command{diff}を使用するより,遥かに役に立つことが多いでしょう.テキ ストファイルに対しては,二つのファイルが同一かどうか,または,一つのファ イルがもう一方のファイルに前置されているかどうかを知りたいだけのとき,主 に役に立つでしょう.
バイト単位での変更を考慮する影響を説明するには,行単位での変更を考慮する ことと比較することが可能で,例えば単一の改行文字がファイルの最初にある場 合に何が生じるかを考えてみてください.そのファイルを,最初に改行が無いだ けの同一の別ファイルと比較する場合,@command{diff}では改行がファイルに追 加されたことを報告しますが,@command{cmp}では二つのファイルはほとんど全 体が異なっていると報告するでしょう.
@command{diff3}は,通常三つの入力ファイルを行単位で比較し,差異のある行 のまとまりを見つけ,それぞれの差異のある行のまとまりを報告します.その出 力は,同じファイルを変更した二つのものの差を調べることを容易にするように 設計されています.
二つのファイルを比較しているとき,@command{diff}は,hunkと呼ばれる 異なっている行のまとまりが疎らに存在している両方のファイルから,共通な行 の並びを探します.二つの同一ファイルの比較では差異のある行は無いので,一 つの共通な行の並びが見つかり,hunkはありません.二つの全く異なるファイル の比較では,共通の行は無く,両方のファイルのすべての行を含んでいる一つの 大きなhunkが生成されます.一般的に,二つの与えられたファイル間で,行のマッ チを調べる方法はたくさんあります.@command{diff}は,大きな共通行の並びを 探しながら差異のある行を小さなhunkにして,全体のhunkの大きさを最小にする よう試みます.
例えば,ファイル`F'は三行`a',`b',`c'を含んでいて, ファイル`G'は同じ行を逆の順序`c',`b',`a'で含んでい ると仮定します.@command{diff}が行`c'を共通として見つけた場合,コマ ンド`diff F G'は以下の出力を生成します.
1,2d0 < a < b 3a2,3 > b > a
しかし,その代わりに共通行`b'に注目する場合,以下の出力を生成します.
1c1 < a --- > c 3c3 < c --- > a
`a'が共通行として見つかる可能性もあります.@command{diff}は常に,ファ イル間の最適なマッチしている部分を見つけるわけではありません.それで実行 がより早くなります.しかし,出力は通常可能な限り短くなるようにします. @option{--minimal}オプションで,このトレードオフを調整することが可能です (see section @command{diff}の性能のトレードオフ).
@option{-E}と@option{--ignore-tab-expansion}オプションは,入力のタブとス ペースの違いを無視します.タブは,次のタブストップまでのスペースの数に等 しいと考えられます.@command{diff}は,タブストップが八文字ごとに設定され ている仮定します.
@option{-b}と@option{--ignore-space-change}オプションはより強力です.そ れらは行末の空白を無視し,それ以外の一つ以上の空白の並びが等価であると考 えます.これらのオプションを用いると,@command{diff}は以下のに行が等価で あると考えます.`$'は行末を示します.
Here lyeth muche rychnesse in lytell space. -- John Heywood$ Here lyeth muche rychnesse in lytell space. -- John Heywood $
@option{-w}と@option{--ignore-all-space}オプションは更に強力です.それら は,片方の行には空白がありもう一方にはない場合でさえ,その差を無視します. 空白文字とは,タブ,改行,垂直タブ,改ページ,キャリッジリターン, そしてスペースです.ロケールによっては,追加の文字が空白として定義されて いるかもしれません.これらのオプションを用いると,@command{diff}は以下の に行を等価と考えます.`$'は行末を示し,`^M'はキャリッジリター ンを示します.
Here lyeth muche rychnesse in lytell space.-- John Heywood$ He relyeth much erychnes seinly tells pace. --John Heywood ^M$
@option{-B}と@option{--ignore-blank-lines}オプションは,空白行の挿入や削 除を無視します.これらのオプションは,完全に空の行だけに効果があります. それらは,空のように見えるが,スペースやタブを含んでいる行には効果があり ません.これらのオプションを用いると,例えばファイルが以下のものを含んで いると考えます.
1. A point is that which has no part. 2. A line is breadthless length. -- Euclid, The Elements, I
これは以下を含んでいるファイルと等価です.
1. A point is that which has no part. 2. A line is breadthless length. -- Euclid, The Elements, I
GNU @command{diff}では,例えば,`Funky Stuff',@samp{funky STUFF},そして`fUNKy stuFf'がすべて同じ名前だと考えるように,小文字 がそれに対応する大文字と等価物として扱うことが可能です.こうするために, @option{-i}や@option{--ignore-case}オプションを使用してください.
@command{grep}-形式の正規表現にマッチする行の挿入と削除を無視するために, @option{-I regexp}や@option{--ignore-matching-lines=regexp} オプションを指定してください.シェルのメタ文字がシェルで展開されるのを避 けるために,正規表現をエスケープしてください.例えば,`diff -I '^[[:digit:]]''は,数字で始まる行のすべての変更を無視します.
しかし@option{-I}は,hunk内のすべての変更行が -- すべて挿入と削除で -- 正規表現にマッチする場合,正規表現を含んでいる行の挿入と削除のみを無視し ます.言い替えると,無視できない変更に対し,それに隣接する変更の完全な組 を無視できるものも含めて@command{diff}は出力します.
一つ以上の@option{-I}オプションを使用して,行を無視するために一つ以上の 正規表現を指定することが可能です.@command{diff}はそれぞれの正規表現に対 し,それぞれの行のマッチを試みます.
ファイルが異なっているかどうかを知りたいだけのときで,差異が何かに注目し ていないとき,概要を出力する書式を使用することが可能です.この書式では, ファイル間の差を表示する代わりに,@command{diff}は単純にファイルに差異が あるかどうかを報告します.@option{-q}と@option{--brief}オプションでこの 書式を選択します.
この書式は,二つのディレクトリの内容を比較するとき特に役に立ちます. @command{diff}は,差異があることが分かるとすぐにファイルの解析を停止する ことが可能なので,それは普通に行ごとに比較するより遥かに速くもなります.
@command{cmp}を使用することで,二つのファイルが違っているかどうかを,短 く示しているものを得ることも可能です.ファイルが異なっているとき,デフォ ルトで,最初の差異が発生したところで@command{cmp}はバイトと行番号を出力 します.@command{cmp}が出力を生成せず,ファイルが異なっているかどうかを 終了ステータスだけで報告するようにするため,その情報を抑制するために @option{-s}オプションを使用することも可能です(see section @command{cmp}の呼び出し).
@command{diff}とは異なり,@command{cmp}はディレクトリを比較することは不 可能です.二つのファイルの比較のみ可能です.
@command{diff}が比較している二つのファイルのうちの一方がバイナリ(テキス トファイルではない)と考える場合,通常ファイルの組を概要の出力書式が選択 されているように(see section ファイルの差の概要)扱い,バイナリファイルが異なっていること だけを報告します.これは,行単位での比較がバイナリファイルに対して普通は 意味が無いためです.
ファイルの最初の数バイトを調査して,@command{diff}はファイルがテキストか バイナリかを決定します.正確なバイト数はシステムに依存しますが,それは通 常数千になります.ファイルの一部のすべてのバイトが`null'ではない場 合,@command{diff}はファイルがテキストだと考えます.それ以外の場合は,ファ イルがバイナリだと考えます.
ファイルがテキストファイルだと@command{diff}に強制的に考えさせたいときも あるでしょう.例えば,`null'文字が含まれているテキストファイルを比 較する可能性があります.@command{diff}は誤って,これらをテキストファイル ではないと決定するでしょう.また,`null'文字を特殊なフォーマットを 示すために使用するワープロシステムで使用されているフォーマットのファイル を比較する可能性もあります.@option{-a}や@option{--text}オプションを使用 することで,@command{diff}に強制的にすべてのファイルがテキストファイルで あると考えさせ,行ごとにそれらを比較させることが可能です.このオプション を使用して比較しているファイルが,実際にはテキストを含んでいない場合,お そらくファイルには数個の改行文字しかなく,@command{diff}の出力は,ファイ ルに含まれているすべての文字からなる長い行の差異を表示するhunkになるでしょ う.
すべてのファイルをバイナリファイルだと@command{diff}に強制的に考えさせ, ファイルが(どのように異なっているかではなく)異なっているかどうかのみを報 告させることも可能です.このために@option{-q}や@option{--brief}オプショ ンを使用してください.
バイナリファイルの差は,@command{diff}の出力結果がすべての差を取り切れな いので,問題が生じると考えられます.この問題で,@command{diff}はステータ ス2で終了します.しかし,この問題は@option{--a}や@option{--text}オプショ ンを用いたり,@option{-q}や@option{--brief}オプションを用いることで発生 しないので,これらどちらのオプションでも,@command{diff}はバイナリファイ ルをテキストファイルのように扱います.
テキストファイルとバイナリファイルで差があるオペレーティングシステムでは, @command{diff}は通常,すべてのデータをテキストとして読み書きします.代わ りにバイナリデータとして@command{diff}に読み書きさせるために, @option{--binary}オプションを使用してください.このオプションは, GNUや伝統的なUnixシステムのようなPOSIX-準拠のシステムでは効果 がありません.しかし,多くのパーソナルコンピュータのオペレーティングシス テムでは,行末の改行の後にキャリッジリターンが存在します.そのようなシス テムでは,@command{diff}は通常入力されるこれらのキャリッジリターンを無視 し,それぞれの出力の行末にキャリッジリターンを生成しますが, @option{--binary}オプションを用いると@command{diff}はそれぞれのキャリッ ジリターンをそのまま入力文字として扱い,それぞれの出力の行末にキャリッジ リターンを生成しません.POSIX-準拠のシステムで変換する予定のテキス トではないファイルを扱うとき,これは役に立つはずです.
@option{--strip-trailing-cr}で,@command{diff}は行末の改行にキャリッジリ ターンが続いている入力行を普通の改行として扱います.多くのパーソナルコン ピュータのオペレーティングシステムからインポートされた不完全なテキストを 比較するとき,これは役に立つはずです.このオプションは行が読み込まれる方 法に影響があり,それは順次,比較される方法と出力の方法に影響していきます.
二つのファイルをバイト単位で比較したい場合,二つのファイルのバイトごとの 差の値を表示するために,@option{-l}オプションを用いて@command{cmp}プログ ラムを使用することが可能です.GNU @command{cmp}を用いると,これらの バイトのASCII表現を表示するために@option{-b}オプションを使用するこ とも可能です.詳細はSee section @command{cmp}の呼び出し.
比較しているファイルのいずれかを@command{diff3}がバイナリ(テキストではな いファイル)と考える場合,そのような比較は普通意味が無いので,通常はエラー を報告します.@command{diff3}は,ファイルがバイナリかどうかを @command{diff}が決定するテストと同じテストを使用します.@command{diff}を 用いるときと同様に,入力ファイルにテキストでないバイトが含まれているが, それ以外はテキストファイルに似ている場合,@option{-a}や@option{--text}オ プションを使用することで,@command{diff3}にすべてのファイルをテキストファ イルと考えさせ,行単位での比較を強制させることが可能です.
Go to the first, previous, next, last section, table of contents.