トップ 履歴 一覧 カテゴリ ソース 検索 ヘルプ RSS ログイン

UnixCmd/diff

INDEX

diff と patch

diff はファイルの比較を行うためのコマンドで、2つのファイル間の違いを出力する。patch はパッチ処理を行うコマンドで、パッチファイルに従ってテキストファイルを更新する。

さらに diff コマンドの出力結果の差分ファイルは、そのまま patch コマンドのパッチファイルとなる。なので、お互いにファイルを持っていて、一方が修正を行ったときに、修正したファイルをすべて送らなくても diff コマンドで新旧の差分ファイルを作成して相手に送れば、相手は受け取ったパッチファイルと patch コマンドで修正されたファイルに更新することができる。

 diff と patch の利用

たとえば、次のような2つのファイルがあったとする。

$ cat old
No change line.
Changed line.
No change line.
Deleted line.
No change line.
No change line.
$ cat new
No change line.
Modified line.
No change line.
No change line.
Added line.
No change line.
$

次のようにして、コンテキスト形式のdiffをとる。

$ diff -c old new

コマンドを実行すると次のような出力が得られる。

*** old 2008-12-08 12:34:56.123456789 +0900
--- new 2008-12-09 12:34:56.123456789 +0900
***************
*** 1,6 ****
  No change line.
! Changed line.
  No change line.
- Deleted line.
  No change line.
  No change line.
--- 1,6 ----
  No change line.
! Modified line.
  No change line.
  No change line.
+ Added line.
  No change line.

次のようにして、古いファイルと差分ファイルから新しいファイルを作成することが可能となる。

$ diff -c old new > file.diff
$ mv new new.org
$ patch < file.diff

diff

 起動

diff [オプション]... FILES

 起動オプション

-c | -e | -f | -n | -u
出力形式の指定。下記参照
-r
ディレクトリを比較したとき、再帰的にたどる。
-i
大文字・小文字の違いを無視する。
-b
空白・タブの数の違いを無視する。
-B
空行の違いは無視する。
-w
行を比較するとき、行中の余白を無視する。

 ノーマル形式

$ diff old new
2c2
< Changed line.
---
> Modified line.
4d3
< Deleted line.
5a5
> Added line.
$

  コンテキスト形式

$ diff -c old new
*** old 2008-12-08 12:34:56.123456789 +0900
--- new 2008-12-09 12:34:56.123456789 +0900
***************
*** 1,6 ****
  No change line.
! Changed line.
  No change line.
- Deleted line.
  No change line.
  No change line.
--- 1,6 ----
  No change line.
! Modified line.
  No change line.
  No change line.
+ Added line.
  No change line.
$

パッチの先頭行には、ファイルのパスやタイムスタンプといった情報が書かれる。「***」が変更前で、「---」が変更後のファイル(の内容)となる。

各変更箇所の先頭には、それぞれのファイルにおける変更箇所の対応行番号が書かれる。「*** 1,6 ****」は、以下に続く内容が変更前の1行目から6行目を示し、「--- 1,6 ----」は、変更後の1行目から6行目であることを示す。

また、「+」で始まる行は、その行が追加されていることを示し、「-」で始まる行は、その行が削除されていることを示し、「!」で始まる行は、その行が変更されている行であることを示し、行頭がスペースで始まる行は、その行が変更されていないを示す。

 ユニファイド形式

$ diff -u old new
--- old 2008-12-08 12:34:56.123456789 +0900
+++ new 2008-12-09 12:34:56.123456789 +0900
@@ -1,6 +1,6 @@
 No change line.
-Changed line.
+Modified line.
 No change line.
-Deleted line.
 No change line.
+Added line.
 No change line.
$

patch

 起動

patch [OPTION]... [ORIGFILE [PATCHFILE]]

 起動オプション

Win32移植版

 ソフトウェア工房α - プログラミング・ツール(移植ソフト)

http://cetus.sakura.ne.jp/softlab/toolbox1/

GNU diffutils 2.7.2 および GNU patch 2.5.4 の Win32 移植版です。

 GnuWin32

http://gnuwin32.sourceforge.net/

最終更新時間:2009年05月25日 21時36分26秒 指摘や意見などあればSandBoxのBBSへ。