このページの内容

1.7 バイナリファイルとテキスト比較の強制

diffが比較する2つのファイルのどちらかをバイナリ(テキストではないファイル)と判断すると、通常、その組を要約出力書式が選ばれた場合とほぼ同じように扱い(異なるファイルを要約して報告するを参照)、バイナリファイルが異なることだけを報告します。バイナリファイルでは、行ごとの比較に意味がないことが多いためです。出力にすべての差分が含まれなくても、これは障害とはみなされません。

diffは、ファイルの先頭の数バイトを調べて、テキストかバイナリかを判定します。調べる正確なバイト数はシステムに依存しますが、通常は数千バイトです。その部分のすべてのバイトがNULでなければ、diffはテキストとみなし、そうでなければバイナリとみなします。

diffにファイルをテキストとみなすよう強制したい場合もあります。たとえば、NUL文字を含むテキストファイルを比較していると、diffは誤ってテキストではないと判断します。あるいは、特殊な書式を示すためにNUL文字を使うワープロ形式の文書を比較しているかもしれません。--text(-a)オプションを使うと、diffにすべてのファイルをテキストとみなし、行ごとに比較させられます。このオプションで比較するファイルが実際にはテキストでない場合、改行文字はおそらく少なく、diffの出力は、ファイルに含まれる文字を並べた長い行の差分を示すhunkになります。

diffに、ファイルが異なるかどうかだけを、違いの内容を示さずに報告させることもできます。そのためには、--brief(-q)オプションを使います。

テキストファイルとバイナリファイルを区別するOSでは、diffは通常、すべてのデータをテキストとして読み書きします。代わりにdiffにバイナリデータとして読み書きさせるには、--binaryオプションを使います。このオプションは、GNUや従来のUnixなどのPOSIX準拠システムでは効果がありません。ただし、多くのパソコン向けOSでは、行末を復帰に続く改行で表します。そのようなシステムでは、diffは通常、入力時にこれらの復帰を無視し、出力時には各行末に復帰を生成します。一方、--binaryオプションを使うと、diffは各復帰を通常の入力文字として扱い、各出力行の末尾に復帰を生成しません。POSIX準拠システムと交換するための非テキストファイルを扱うときに役立ちます。

--strip-trailing-crを使うと、diffは復帰と改行で終わる入力行を、単純な改行だけで終わる行として扱います。多くのパソコン向けOSから不完全な形で取り込まれたテキストを比較するときに役立ちます。このオプションは行の読み取り方に影響し、その結果、比較と出力にも影響します。

2つのファイルをバイトごとに比較したい場合は、cmpプログラムの--verbose(-l)オプションを使い、2つのファイルで異なる各バイトの値を表示できます。GNU cmpでは、-bまたは--print-bytesオプションを使うと、それらのバイトのASCII表現も表示できます。詳細はcmpの起動を参照してください。

diff3が、比較するファイルのどれかをバイナリ(テキストではないファイル)と判断すると、通常はエラーを報告します。そのような比較は通常役立たないためです。diff3は、ファイルがバイナリかどうかの判定にdiffと同じ方法を使います。diffの場合と同様、入力ファイルが非テキストのバイトを少数含んでいても、それ以外はテキストファイルのような内容なら、-aまたは--textオプションを使って、diff3にすべてのファイルをテキストとみなし、行ごとに比較させられます。