4 ディレクトリを比較する
diffを使うと、2つのディレクトリツリーにあるファイルの一部またはすべてを比較できます。diffに渡す2つのファイル名引数が両方ともディレクトリの場合、両方に含まれる各ファイルを比較します。ファイル名は、ロケールカテゴリーLC_COLLATEで指定されたアルファベット順で調べられます。通常、diffは差分のないファイルの組について何も表示しませんが、--report-identical-files(-s)オプションを使うと、同一のファイルの組も報告します。通常、diffは両方に共通するサブディレクトリを報告するだけで、その中のファイルは比較しません。-rまたは--recursiveオプションを使うと、ディレクトリツリーの深さにかかわらず、対応するファイルの組をすべて比較します。
一方のファイルだけが存在する場合、diffは通常、その内容を表示せず、一方が存在して他方が存在しないことだけを報告します。存在しないファイルを空とみなすようにdiffを動作させると、実際に存在するファイルの全内容が出力されます。存在しないファイルが最初と2番目のどちらの位置にあるかに応じて、挿入または削除として出力されます。そのためには、--new-file(-N)オプションを使います。このオプションは、ディレクトリの走査で見つかるファイルだけでなく、コマンドライン引数にも適用されます。たとえば「diff
-N a b」は、aが存在せずbが存在する場合、aを空とみなします。
古いディレクトリに、新しいディレクトリにはない大きなファイルが含まれている場合、-Nの代わりに--unidirectional-new-fileオプションを使うと、パッチを小さくできます。このオプションは-Nに似ていますが、最初のディレクトリにはなく2番目のディレクトリにあるファイル、つまり追加されたファイルの内容だけを挿入します。パッチの冒頭には、削除されたファイルをパッチ適用前に取り除くよう、パッチを適用する人への指示を書いてください。配布用パッチの作成について詳しくは、パッチの作成と使用のヒントを参照してください。
ディレクトリを比較するときに一部のファイルを無視するには、--exclude=pattern(-x pattern)オプションを使います。このオプションは、ベース名がシェルのパターンpatternに一致するファイルやサブディレクトリを無視します。シェルとは異なり、ファイル名のベース名の先頭にあるピリオドも、パターン先頭のワイルドカードに一致します。シェルが展開しないよう、patternを引用符で囲んでください。たとえば-x '*.[ao]'オプションは、名前が「.a」または「.o」で終わるファイルをすべて無視します。
このオプションを複数回指定すると、指定内容が累積します。たとえば-x 'RCS' -x '*,v'を使うと、ベース名が「RCS」であるか、「,v」で終わるファイルやサブディレクトリをすべて無視します。
このオプションを何度も指定する必要がある場合は、代わりにパターンを1行に1つずつファイルに書き、--exclude-from=file(-X file)オプションを使えます。パターンファイル内の末尾の空白と空行は無視されます。
2つのディレクトリの比較を途中で止め、後で続きから再開したいことがあります。--starting-file=file(-S file)オプションで再開できます。最上位のディレクトリ階層で、ファイルfileと、アルファベット順でそれより後のファイルだけを比較します。
一方のディレクトリではファイル名が小文字、他方では大文字になっていることだけが異なる場合、diffは通常、ファイル名の大文字・小文字を区別して比較するため、多くの差分を報告します。--ignore-file-name-caseオプションを使うと、diffはファイル名の大文字・小文字の差分を無視します。たとえば、一方のディレクトリのファイルTaoの内容を、他方のファイルTAOの内容と比較します。--no-ignore-file-name-caseオプションは--ignore-file-name-caseの効果を取り消し、既定の動作に戻します。
--ignore-file-name-caseオプションが有効なときに、--exclude=pattern(-x pattern)または--exclude-from=file(-X file)オプションを指定すると、指定パターンに一致するファイル名を除外する際にも、大文字・小文字を区別しません。
diffがシンボリックリンクをたどらないようにするには、--no-dereferenceオプションを使います。