diffについての覚え書き
今日はdiffについて調べたことを書くでふ。
diffとは
diffプログラムはファイルの比較を行うためのコマンドで、2つのファイル間の違いを出力できる。diffプログラムは行単位でテキストファイル間の差異を表示する。最近の実装では、バイナリファイルもサポートしている。
diff - Wikipedia
出力形式
二つのファイルの違いを表示する仕方には、標準の(伝統的な)形式、コンテキスト形式(context format)、ユニファイド形式(unified format)、その他さまざまなものがある。詳細はComparing and Merging Files: 2. diffの出力書式を参照のこと。個人的には、ユニファイド形式が一番見やすい。
コマンドラインで diff text1 text2 とすると、diffは、text1に変更を加えた結果のファイルがtext2であるという想定の下、その差分を表示するようである(実際は二つは無関係のファイルだったとしても)。よって、そのことを頭において出力を眺めると、分かりやすいと思われる。
以下、diffコマンドの出力行の末尾に適宜、 "#" によるコメントを付与することで簡単な解説を行う。
標準形式
$ cat text1 abc def ghi jkl $ cat text2 def GHI jkl mno pqr $ diff text1 text2 1d0 # text1の1行目のabcはtext2では削除(d) (もし削除しなかったら、text2では0行目と次の行(1行目)との間にあるはずだった) < abc 3c2 # text1の3行目のghiは、text2では2行目のGHIに変更(c) < ghi --- > GHI 4a4,5 # text1の4行目と次の行(5行目)との間に、text2の4-5行目を新たに追加(a) > mno > pqr
コンテキスト形式
$ diff -c text1 text2 # -c でコンテキスト形式 *** text1 2009-03-17 17:51:04.000000000 +0900 #「*」はtext1(変更前)、「-」はtext2(変更後)を指すのに使う --- text2 2009-03-17 17:51:25.000000000 +0900 *************** *** 1,4 **** # text1の1行目から4行分のtext2での変更状況を以下に記述 - abc # text2では削除 def ! ghi # text2では変更 jkl --- 1,5 ---- # text2の1行目から5行分のtext1からの変更状況を以下に記述 def ! GHI # text1から変更 jkl + mno # text1の当該位置に追加 + pqr
ユニファイド形式
$ diff -u text1 text2 # -u でユニファイド形式 --- text1 2009-03-17 17:51:04.000000000 +0900 #「-」はtext1(変更前)、「+」はtext2(変更後)を指すのに使う +++ text2 2009-03-17 17:51:25.000000000 +0900 @@ -1,4 +1,5 @@ # text1の1行目から4行分と、text2の1行目から5行分を以下で比較する、の意 -abc # text1のこの行はtext2では削除された def # 先頭がスペースの行は変更なし -ghi +GHI # text2のこの行はtext1の当該位置に挿入された jkl +mno +pqr
参考リンク
- man 1 diff - Linux Man Pages
- diffのmanファイル。
- diff - Wikipedia
- diffの歴史やフォーマットの見方などの概要。
- http://www.bookshelf.jp/texi/diff/diff-ja.html
- diffや関連するコマンドによるファイルの比較、統合についての包括的で詳細な解説(原典)。
- diffコマンドの使い方: UNIX/Linuxの部屋
- コマンドの基本的な用法やオプション、パッチの当て方などの簡単な解説。