このページの内容

概要

コンピューターを使っていると、2つのファイルがどう違うのかを知りたくなることがよくあります。一方が他方の新しい版なのかもしれません。あるいは、同じ内容のコピーから始まった2つのファイルを、別々の人が変更したのかもしれません。

diffコマンドを使うと、2つのファイルの差分や、2つのディレクトリー内で対応する各ファイルの差分を表示できます。diffはファイル間の差分を行ごとに出力します。出力には複数の書式があり、コマンドラインオプションで選択できます。この差分のまとまりを、よくdiffまたはパッチと呼びます。ファイルが同一なら、diffは通常何も出力しません。バイナリ(テキストではない)ファイルについては、diffは通常、異なることだけを報告します。

cmpコマンドを使うと、2つのファイルが異なる位置のバイト番号と行番号を表示できます。cmpは、2つのファイル間で異なるすべてのバイトを横に並べて表示することもできます。2つのファイルを文字ごとに比較する方法として、EmacsのM-x compare-windowsコマンドがあります。このコマンドの詳細は、The GNU Emacs ManualのOther Windowを参照してください。

diff3コマンドを使うと、3つのファイル間の差分を表示できます。2人が共通の原本に独立した変更を加えた場合、diff3は原本と変更後の2つの版との差分を報告できます。また、双方の変更を取り込んだマージ済みファイルを、競合についての警告とともに生成できます。

sdiffコマンドを使うと、2つのファイルを対話的にマージできます。

diffが生成した差分を使って、プログラムのソースコードなどのテキストファイルの更新をほかの人に配布できます。この方法は、ファイル全体に比べて差分が小さい場合に特に役立ちます。diffの出力があれば、patchプログラムを使ってファイルのコピーを更新、つまりパッチ適用できます。diffを、一方のファイルから他方を引いて差分を求めるものと考えるなら、patchは一方のファイルに差分を足して他方を再現するものと考えられます。

このマニュアルでは、まずdiffの作成を中心に説明し、その後、diffを使ってファイルを更新する方法を説明します。

GNU diffはPaul Eggert、Mike Haertel、David Hayes、Richard Stallman、Len Towerが作成しました。unified出力書式はWayne Davisonが設計・実装しました。基本的なアルゴリズムは、Eugene W. Myersの「An O(ND) Difference Algorithm and its Variations」、Algorithmica第1巻、1986年、251–266ページ、http://dx.doi.org/10.1007/BF01840446、およびWebb MillerとEugene W. Myersの「A File Comparison Program」、Software—Practice and Experience第15巻、1985年、1025–1040ページ、http://dx.doi.org/10.1002/spe.4380151102で説明されています。このアルゴリズムは独立にも発見されており、Esko Ukkonenの「Algorithms for Approximate String Matching」、Information and Control第64巻、1985年、100–118ページ、http://dx.doi.org/10.1016/S0019-9958(85)80046-2で説明されています。--minimalオプションを使わない限り、diffはPaul Eggertのヒューリスティックを使い、計算コストをO(N^1.5 log N)に抑えます。その代わり、差分が多い大きな入力では最適ではない出力になることがあります。関連するアルゴリズムは、Alfred V. Ahoの「Algorithms for Finding Patterns in Strings」の6.3節、Handbook of Theoretical Computer Science(Jan Van Leeuwen編)、A巻、Algorithms and Complexity、Elsevier/MIT Press、1990年、255–300ページで概説されています。

GNU diff3はRandy Smithが、GNU sdiffはThomas Lordが、GNU cmpはTorbjörn GranlundとDavid MacKenzieが作成しました。

GNU patchは主にLarry WallとPaul Eggertが作成し、Wayne DavisonとDavid MacKenzieがGNU向けのいくつかの拡張を提供しました。このマニュアルの一部は、Larry Wallが書いたマニュアルページを本人の許諾を得て改編したものです。