試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

diffファイル(unified形式)について

ファイルを修正したときに、修正した部分(元のファイルと違う部分)だけを書く方式がある。修正前のファイルとその差分があれば、修正後の状態を作ることができる。

  1. テスト文書を編集し、差分を取ってみる
  2. unified形式の見方
  3. 作成したdiffを使って、patchコマンドから修正を行ってみるテスト
  4. unified以外の形式との比較

テスト文書を編集し、差分を取ってみる

ファイル名: test.txt.orig

あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
はひふへほ
まみむめも
やゆよ
らりるれろ
わをん

これを下のように修正した場合
ファイル名: test.txt

あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねのん
はひふへほ
まみむめも
やゆよ
らりるれろ
わをん
がぎぐげご

端末上でdiffコマンドを-uオプション付きで実行すると

$ diff -u test.txt.orig test.txt
--- test.txt.orig       2007-06-10 22:13:55.718311614 +0900
+++ test.txt    2007-06-10 22:54:23.038008776 +0900
@@ -2,9 +2,10 @@
 かきくけこ
 さしすせそ
 たちつてと
-なにぬねの
+なにぬねのん
 はひふへほ
 まみむめも
 やゆよ
 らりるれろ
 わをん
+がぎぐげご

上のような差分が出る。

unified形式の見方

上の例では-uというオプションを付けたが、これは人間が読みやすいunified形式で出力する指示。
「+++ test.txt」という部分では、test.txtという名前のファイルに対して変更をすることを示す。
「@@」の付いている行は、テキストの違いが存在する領域(Hunk/テキストブロック)の始まりを示し、数字は修正前後のファイル内の該当する範囲を示す。Hunkが複数存在する場合は「@@」の行も同じ数だけ存在する。

-なにぬねの
+なにぬねのん

この部分では、-の「なにぬねの」の行を消して、+の「なにぬねのん」をそこに挿入することを示す。
「-」「+」のいずれも含まれない行に対しては何も行わない。

作成したdiffを使って、patchコマンドから修正を行ってみるテスト

差分をファイルに書き出してから修正対象のtest.txtを修正前の状態に戻し、その後差分ファイルを利用して修正を適用してみる実験。

$ diff -u test.txt.orig test.txt > test.patch
$ cp test.txt.orig test.txt
$ patch < test.patch
patching file test.txt

これでtest.txtは修正後の状態になる。

unified以外の形式との比較

diffコマンドは、他にも幾つかの形式で差分を出力できる。色々試した結果、unified形式は、最も見やすい以外にも、他の形式と比べてみた結果、出力がコンパクトになるということも分かった。
(2007/6/24)参考として、diffコマンドが出力する他の形式について、unified形式と比較してみた。