使用法: diff [オプション]... FILES
2つのファイルを行ごとに比較します。
-i --ignore-case ファイル内容の大文字小文字を無視。
--ignore-file-name-case ファイル名の大文字小文字を無視。
--no-ignore-file-name-case ファイル名の大文字小文字を区別。
-E --ignore-tab-expansion タブ展開の差を無視。
-b --ignore-space-change 空白数の差を無視。
-w --ignore-all-space 全空白を無視。
-B --ignore-blank-lines 空白だけの行の差を無視。
-i RE --ignore-matching-lines=RE REに一致するすべての行の差を無視。
--strip-trailing-cr 入力から行末キャリッジ・リターンを削除。
-a --text すべてテキストとして処理。
-c -C NUM --context[=NUM] コピーした前後NUM行 (既定は3) を出力。
-u -U NUM --unified[=NUM] 統合した前後NUM行 (既定は3) を出力。
--label LABEL ファイル名の代わりにLABELを使用。
-p --show-c-function 各変更を含むCの関数名を表示。
-F RE --show-function-line=RE REと一致する直近の行を表示。
-q --brief ファイルが異なるかどうかだけを出力。
-e --ed edスクリプトを出力。
--normal 標準的な差分を出力。
-n --rcs RCS形式の差分を出力。
-y --side-by-side 縦列出力。
-W NUM --width=NUM 高々NUM (既定は130) 印字桁で出力。
--left-column 共通行は左列だけ出力。
--suppress-common-lines 共通行の出力を抑止。
-D NAME --ifdef=NAME 差分を「#ifdef NAME」で示す併合ファイルを出力。
--GTYPE-group-format=GFMT 同様だが、GTYPEの入力群をGFMTで整形。
--line-format=LFMT 同様だが、全入力行をLFMTで整形。
--LTYPE-line-format=LFMT 同様だが、LTYPE入力行をLFMTで整形。
ここでLTYPEは「old」「new」「unchanged」。GTYPEはLTYPEか「changed」。
GFMTには以下を指定できます:
%< FILE1の行
%> FILE2の行
%= FILE1とFILE2の共通行
%[-][WIDTH][.[PREC]]{doxX}LETTER printf風指定でのLETTER
LETTERは、以下の文字で新しい方、小文字で古い方:
F 最初の行番号
L 最後の行番号
N 行数 = L-F+1
E F-1
M L+1
LFMTには以下を指定できます:
%L 行内容
%l 後続する改行をのぞいた行内容
%[-][WIDTH][.[PREC]]{doxX}n printf風指定での入力行数
GFMTやLFMTには以下を指定できます:
%% %
%c'C' 文字C一文字
%c'\OOO' 8進コードOOOの文字
-l --paginate 出力を「pr」でページ分割。
-t --expand-tabs 出力のタブを空白に展開。
-T --initial-tab タブで始まる行は、前にタブを置いて揃える。
-r --recursive 見つかった下位ディレクトリーを再帰的に比較。
-N --new-file 存在しないファイルは空とみなす。
--unidirectional-new-file 存在しない前者のファイルは空とみなす。
-s --report-identical-files 両ファイルが同じときに報告。
-x PAT --exclude=PAT PATと一致するファイルを除外。
-X FILE --exclude-from=FILE FILE内の各パターンと一致するファイルを除外。
-S FILE --starting-file=FILE ディレクトリーを比較する際、FILEから始める。
--from-file=FILE1 全オペランドとFILE1を比較。FILE1はディレクトリーも可。
--to-file=FILE2 FILE2と全オペランドを比較。FILE2はディレクトリーも可。
--horizon-lines=NUM 先頭と末尾にある共通なNUM行を確保。
-d --minimal できるだけがんばって、小さい差分を見つける。
--speed-large-files 巨大なファイルに分散した変更があると仮定。
-v --version バージョン情報を出力。
--help この説明を出力。
FILESは、「FILE1 FILE2」「DIR1 DIR2」「DIR FILE...」「FILE... DIR」。
--from-fileや--to-fileを指定すれば、FILESの制限はありません。
ファイルが「-」のとき、標準入力を読みます。
バグを見つけたら
Usage: diff [OPTION]... FILES
Compare files line by line.
-i --ignore-case Ignore case differences in file contents.
--ignore-file-name-case Ignore case when comparing file names.
--no-ignore-file-name-case Consider case when comparing file names.
-E --ignore-tab-expansion Ignore changes due to tab expansion.
-b --ignore-space-change Ignore changes in the amount of white space.
-w --ignore-all-space Ignore all white space.
-B --ignore-blank-lines Ignore changes whose lines are all blank.
-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE.
--strip-trailing-cr Strip trailing carriage return on input.
-a --text Treat all files as text.
-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied context.
-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified context.
--label LABEL Use LABEL instead of file name.
-p --show-c-function Show which C function each change is in.
-F RE --show-function-line=RE Show the most recent line matching RE.
-q --brief Output only whether files differ.
-e --ed Output an ed script.
--normal Output a normal diff.
-n --rcs Output an RCS format diff.
-y --side-by-side Output in two columns.
-W NUM --width=NUM Output at most NUM (default 130) print columns.
--left-column Output only the left column of common lines.
--suppress-common-lines Do not output common lines.
-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs.
--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT.
--line-format=LFMT Similar, but format all input lines with LFMT.
--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT.
LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'.
GFMT may contain:
%< lines from FILE1
%> lines from FILE2
%= lines common to FILE1 and FILE2
%[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER
LETTERs are as follows for new group, lower case for old group:
F first line number
L last line number
N number of lines = L-F+1
E F-1
M L+1
LFMT may contain:
%L contents of line
%l contents of line, excluding any trailing newline
%[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number
Either GFMT or LFMT may contain:
%% %
%c'C' the single character C
%c'\OOO' the character with octal code OOO
-l --paginate Pass the output through `pr' to paginate it.
-t --expand-tabs Expand tabs to spaces in output.
-T --initial-tab Make tabs line up by prepending a tab.
-r --recursive Recursively compare any subdirectories found.
-N --new-file Treat absent files as empty.
--unidirectional-new-file Treat absent first files as empty.
-s --report-identical-files Report when two files are the same.
-x PAT --exclude=PAT Exclude files that match PAT.
-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE.
-S FILE --starting-file=FILE Start with FILE when comparing directories.
--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory.
--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory.
--horizon-lines=NUM Keep NUM lines of the common prefix and suffix.
-d --minimal Try hard to find a smaller set of changes.
--speed-large-files Assume large files and many scattered small changes.
-v --version Output version info.
--help Output this help.
FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'.
If --from-file or --to-file is given, there are no restrictions on FILES.
If a FILE is `-', read standard input.
Report bugs to
DIFF(1) DIFF(1)
名前
diff - 2 つのファイル間の違いを探す
書式
diff [-abcdefhilnpqrstuwyBEHNPT] [-LINES] [-x PATTERN] [-C LINES] [-D
NAME] [-F REGEXP] [-I REGEXP] [-L LABEL] [-S FILE] [-U LINES] [-W
COLUMNS] [-X FILE] [--binary] [--brief] [--changed-group-format=fORMAT]
[--context[=LINES]] [--diff-program=PROGRAM] [--ed] [--exclude=PATTERN]
[--exclude-from=FILE] [--expand-tabs] [--forward-ed] [--from-file=FILE]
[--horizon-lines=LINES] [--ifdef=NAME] [--ignore-all-space]
[--ignore-blank-lines] [--ignore-case] [--ignore-file-name-case]
[--ignore-matching-lines=REGEXP] [--ignore-space-change]
[--ignore-tab-expansion] [--inhibit-hunk-merge] [--initial-tab]
[--label=LABEL] [--left-column] [--line-format=FORMAT] [--minimal]
[--new-file] [--new-group-format=FORMAT] [--new-line-format=FORMAT]
[--no-ignore-file-name-case] [--old-group-format=FORMAT]
[--old-line-format=FORMAT] [--paginate] [--rcs] [--recursive]
[--report-identical-files] [--sdiff-merge-assist] [--show-c-function]
[--show-function-line=REGEXP] [--side-by-side] [--speed-large-files]
[--starting-file=FILE] [--strip-trailing-cr] [--supress-common-lines]
[--text] [--to-file=FILE] [--unchanged-group-format=FORMAT]
[--unchanged-line-format=FORMAT] [--unidirectional-new-file] [--uni-
fied[=LINES]] [--width=COLUMNS] FROMFILE TOFILE
diff [-v] [--help] [--version]
説明
diff は 2 つのファイルを比較し、それらの違いを記述して出力する。
も っとも簡単な場合は、比較対象のファイルは FROMFILE と TOFILE である。
これらのファイルのうちのどちらかは ‘-’ と指定しても良い。この時はそのフ
ァイルは標準入力から読み込まれる。
FROMFILE がディレクトリで TOFILE がディレクトリではない場合、 diff はデ
ィレクトリ FROMFILE にある、ファイル名が TOFILE のファイルを比較対象 に
す る (逆も同様)。ディレクトリでない方の指定を ‘-’ にすることはできない
。
両方がディレクトリのときは、 diff は双方のディレクトリにある、対応す る
フ ァイルをアルファベット順にそれぞれ比較する。比較は再帰的には行われな
いが、 -r または --recursive オプションを指定すれば再帰的になる。 diff
は ディレクトリの内容そのものをファイルのように比較することはしない。フ
ルパス指定のファイルは ‘-’ であってはならない。なぜなら標準入力には名前
がないので、「同名のファイル」という概念が使えないからである。
--from-file=FILE オプションが与えられると、任意の数のファイル名を与える
ことができ、それぞれのファイルは FILE と 比 較 さ れ る 。 同 様 に 、
--to-file=FILE オプションが与えられると、それぞれ指定されたファイルは
FILE と比較される。 [訳注: 2.7 にはこれらのオプションは存在しない]
オプション
-LINES 異なっている部分の前後 LINES 行 (整数) 分のコンテクストを表示 す
る 。このオプションは出力形式自体の指定は行わない。したがって -c
や -u オプションと一緒に用いないと、なんの効果も持たない。このオ
プションは obsolete である。 patch(1) が正しく動作するには、少な
くとも 2 行のコンテクストが必要である。
-a, --text
ファイルがテキストには見えないような場合でも、全てのファイルをテ
キストとみなして 1 行ずつ比較を行う。
-b, --ignore-space-change
スペースの数だけが違う場合には違いを無視する。不完全な行は無視さ
れる。
-c context 出力形式を用いる。
-d, --minimal
アルゴリズムを変更し、より小さな差分が生成できるようにする。これ
を使うと diff は遅くなる (非常に遅くなる場合もある)。
-e, --ed
ed(1) のスクリプト形式で出力する。
-f, --forward-ed
ed のスクリプトと一見同じような出力をする。しかし出力に現れる順
序が異なる [訳注: したがって ed では使えない]。
-h 現在は何も効果を持たない。Unix との互換性のために存在している 。
これは推奨されない。
-i, --ignore-case
英大文字と小文字の違いを無視する。
-l, --paginate
出力を pr(1) に通してページ付けを行う。
-n, --rcs
RCS 形式の diff を出力する。 -f と似ているが、それぞれのコマンド
は処理する行数を指定する。
-p, --show-c-function
変更がどの C 関数で行われたのかを表示する。 ‘-F’^[_a-zA-Z$]’’ と
同じ。
-q, --brief
ファイルが違うかどうかだけを報告する。違いの詳細は報告しない。
-r, --recursive
ディレクトリを比較するとき、見付かったサブディレクトリをすべて再
帰的に比較する。
-s, --report-identical-files
2 つのファイルが同じだったときも報告する。
-t, --expand-tabs
入力ファイルでのタブによる位置あわせを保存するため、出力のタブを
スペースに展開する。
-u unified 出力形式を用いる。
-w, --ignore-all-space
行を比較するときスペースを無視する。不完全な行は無視される。
-x PATTERN, --exclude=PATTERN
デ ィレクトリを比較するとき、ファイル名の base 部が PATTERN にマ
ッチするファイルやサブディレクトリを無視する。
-y, --side-by-side
side-by-side 出力形式を用いる。
-B, --ignore-blank-lines
空行を挿入・削除するだけの変更を無視する。
-C LINES, --context[=LINES]
context 出力形式を用い、 LINES 行 (整数値) のコンテクストを表 示
す る。 LINES が与えられなければ 3 行表示する。 patch が正しく動
作するためには、少なくとも 2 行のコンテクストが必要であること が
多い。
-D NAME, --ifdef=NAME
if-then-else 形式でマージされた出力を行い、プリプロセッサの条件
マクロに NAME を用いる。
-E, --ignore-tab-expansion
タブ展開によるスペースの変更を無視する。
-F REGEXP, --show-function-line=REGEXP
context 形式と unified 形式において、各差分 hunk (テキストブロッ
ク) に対し、その前方で REGEXP にマッチした最後の行の一部を表示す
る。
-H, --speed-large-files
小さな変更が大量にあるような大きなファイルを高速に扱うために、ヒ
ューリスティックな手法を用いる。短縮形式 -H は推奨されなくなった
。
-I REGEXP, --ignore-matching-lines=REGEXP
REGEXP にマッチするような行を挿入・削除するだけの変更を無視す る
。
-L LABEL, --label=LABEL
context 形式と unified 形式のヘッダに、ファイル名ではなく LABEL
を用いる。短縮形式 -L は推奨されなくなった。
-N, --new-file
ディレクトリを比較する際、片方のディレクトリにのみファイルが存在
していたら、もう片方のディレクトリには同名の空っぽのファイルがあ
るように動作する。
-P, --unidirectional-new-file
ディレクトリを比較する際、 2 番目のディレクトリにのみファイル が
存 在していたら、 1 番目のディレクトリには同名の空っぽのファイル
があるように動作する。短縮形式 -P は推奨されなくなった。
-S FILE, --starting-file=FILE
ディレクトリを比較する際、 FILE から始める。中断した比較を続行す
る際に利用できる。
-T, --initial-tab
normal 形式や context 形式で、テキストの前にスペースでなくタブを
出力する。こうすると行中でのタブによる桁揃えが普通に見える。
-U LINES, --unified[=LINES]
unified 出力形式を用い、 LINES 行 (整数値) のコンテクストを表 示
す る。 LINES が与えられなければ 3 行表示する。 patch が正しく動
作するためには、少なくとも 2 行のコンテクストが必要であること が
多い。
-W COLUMNS, --width=COLUMNS
side-by-side 形式で、出力の幅を COLUMNS にする。
-XFILE, --exclude-from=FILE
ディレクトリを比較する際、ファイル名の base 部が FILE のパターン
のいずれかにマッチするファイルやサブディレクトリを無視する。
--binary
データをバイナリモードで読み書きする (Linux やその他の POSIX ホ
ストでは意味なし)。
--changed-group-format=FORMAT
if-then-else 形 式で、両方のファイルで異なる行グループの出力に
FORMAT を用いる。
--diff-program= PROGRAM
ファイルの比較するために diff と互換性のある外部プログラム PRO-
GRAM を用いる。
--from-file=FILE
FILE を各オペランドと比較する (FILE はディレクトリでも良い)。 [
訳注: 2.7 にはこのオプションは存在しない]
--horizon-lines=LINES
差分をもっともコンパクトに出力するために、違う部分の前後にある共
通部分のそれぞれ LINES 行を捨てずに保存する。
--ignore-file-name-case
ファイルを比較する際にファイル名の大文字小文字を無視する。そのた
め ‘‘foo’’ と ‘‘Foo’’ は同じとされるので、互いに比較される。
--inhibit-hunk-merge
隣接する hunk の境界を移動して hunk をマージする動作を行わない。
--left-column
side-by-side 形式で、共通な行は左側の列にしか表示しない。
--line-format=FORMAT
if-then-else 形式で、全ての入力行の出力に FORMAT を用いる。
--new-group-format=FORMAT
if-then-else 形式で、 2 番目のファイルだけにある行グループの出力
に FORMAT を用いる。
--new-line-format=FORMAT
if-then-else 形式で、 2 番目のファイルだけにある行の出力に FOR-
MAT を用いる。
--no-ignore-file-name-case
ファイルを比較する際に、ファイル名の大文字小文字を考慮する。その
た め ‘‘foo’’ と ‘‘Foo’’ は 同 じ も の と さ れ な い 。
--ignore-file-name-case を参照すること。
--old-group-format=FORMAT
if-then-else 形式で、 1 番目のファイルだけにある行グループの出力
に FORMAT を用いる。
--old-line-format=FORMAT
if-then-else 形式で、 1 番目のファイルだけにある行の出力に FOR-
MAT を用いる。
--sdiff-merge-assist
sdiff(1) 用に追加情報を表示する。 sdiff が diff を実行するときに
このオプションを用いる。通常のユーザーがこのオプションを直接指定
する場合はあまり想定されていない。
--strip-trailing-cr
行末の CR を取り除く。行末のマーカとして CRLF を使うシステムの出
力を処理するときに役立つ。
--suppress-common-lines
side-by-side 形式で共通な行を表示しない。
--unchanged-group-format=FORMAT
if-then-else 形式で、両方のファイルに共通な行グループの 出 力 に
FORMAT を用いる。
--unchanged-line-format=FORMAT
if-then-else 形式で、両方のファイルに共通な行の出力に FORMAT を
用いる。
--help 標準出力に使用方法のメッセージを出力して正常終了する。
-v, --version
diff のバージョン番号を出力する。
出力の形式
context 形式
context 出力形式は 2 行のヘッダからはじまる。これは以下のようなものであ
る:
*** FROMFILE FROMFILE-MODIFICATION-TIME
--- TOFILE TOFILE-MODIFICATION-TIME
-L LABEL を用いるとヘッダの内容は変化する。次に来るのは hunk (テキスト
ブロック) である。繰り返し登場することもある。 context 形式の hunk は以
下のようなものである:
***************
*** FROMFILE-LINE-RANGE ****
FROMFILE-LINE
FROMFILE-LINE...
--- TOFILE-LINE-RANGE ----
TOFILE-LINE
TOFILE-LINE...
異なっている行の周辺のコンテクストの各行には、先頭に 2 つのスペースがつ
いている。 2 つのファイル間で異なっている行には、先頭に表示文字とスペー
スがつく。
! 2 つのファイル間で変更された部分の各行。もう一方のファイルの対応
する部分も ‘!’ でマークされて表示される。
+ 2 つめのファイルで「挿入された」行。1 つめのファイルに対応部分は
ない。
- 1 つめのファイルで「削除された」行。2 つめのファイルに対応部分は
ない。
hunk の全ての変更が挿入であれば、 FROMFILE 各行は省略される。また全ての
変更が削除であれば、 TOFILE 各行は省略される。
unified 形式
--- FROMFILE FROMFILE-MODIFICATION-TIME
+++ TOFILE TOFILE-MODIFICATION-TIME
-L LABEL を用いるとヘッダの内容は変化する。次に来るのは hunk (テキスト
ブロック) である。繰り返し登場することもある。それぞれの hunk はファ イ
ルの異なっている 1 つ 1 つの部分を示している。 unified 形式の hunk は以
下のようなものである:
@@ FROMFILE-RANGE TOFILE-RANGE @@
LINE-FROM-EITHER-FILE
LINE-FROM-EITHER-FILE...
両者で共通な行の前には 1 つのスペースが置かれる。異なる行の前には以下の
表示文字が置かれる:
+ ここで 1 つめのファイルに行の追加が行われた。
- ここで 1 つめのファイルから行の削除が行われた。
side-by-side 形式
ファイルは 2 列に表示され、間に溝 (gutter) が置かれる。溝には以下のマー
カーのいずれか 1 つが含まれる。
‘ ’ 対応する行が共通である。つまり、両方の行が同一であるか、違 い が
--ignore オプションのいずれかによって無視された。
| 対応する行が異なる。両方とも完全か、両方とも不完全かである。
< ファイルは異なり、1 番目のファイルにだけこの行が含まれている。
> ファイルは異なり、2 番目のファイルにだけこの行が含まれている。
( 1 番目のファイルにだけこの行が含まれているが、違いは無視される。
) 2 番目のファイルにだけこの行が含まれているが、違いは無視される。
\ 対応する行が異なる。1 番目の行だけに行末の改行がない。
/ 対応する行が異なる。2 番目の行だけに行末の改行がない。通常出力行
は、そこに含まれる行の末尾に改行がない場合に限って改行されない。
し かし、出力行が 2 行の差異を表している場合には、片方だけに改行
がない場合もあり得る。この場合出力行には改行が出力されるが、溝の
マークは 1 番目の行末に改行がなければ ‘\’ に、2 番目の行末に改行
がなければ ‘/’ になる。
side-by-side 形式が一番読みやすいような場合もあるが、限界もある。この形
式 は通常よりもずっと広い幅の出力を生成し、長すぎる行は折り畳んでしまう
。またこの出力では通常よりも文字の整列への依存が大きくなるので、等幅 フ
ォ ントを使っていなかったり、通常と異なるタブストップを使っていたり、印
字されない文字を使っていたりすると、出力が非常に醜くなる。
ed(1) 形式
1 つ以上の差分 hunk から構成される。末尾に近い方の変更が先に現れ、行 数
の 変化が以降の ed の行番号解釈に影響しないようになっている。 ed 形式の
hunk は以下のようなものである:
CHANGE-COMMAND
TO-FILE-LINE
TO-FILE-LINE...
.
ed は入力の末尾を表すためにピリオド 1 つだけの行を用いるので、 diff は
変 更された行のうち、ピリオド 1 つだけの行をピリオド 2 つに変更してプロ
テクトし、続けて 2 つのピリオドを 1 つにする ed コマンドを書く。 ed 形
式は改行されていない行を表すことができない。したがって 2 番目のファイル
の最終行が変更されていて、かつ改行されていなかった場合、 diff はエラ ー
を報告して、改行があるかのように動作する。
変更コマンドには 3 つの種類がある。それぞれ、1 番目のファイルの行番号 (
またはコンマ区切り指定の行範囲指定)、続けて変更の種類を示す 1 文字の 文
字 からなる。行番号は、すべてファイルのオリジナルの行番号である。変更コ
マンドの種類は以下の通り:
La 1 番目のファイルの L 行目以降に、2 番目のファイルからテキスト を
追加する。例えば ‘8a’ は、以降の行をファイル 1 の 8 行目以降に追
加する。
Rc 1 番目のファイルの行範囲 R を、引き続く行で置き換える。追加と 削
除の組み合わせでも同じことができるが、こちらのほうがコンパクトで
ある。例えば ‘5,7c’ はファイル 1 の 5 行目から 7 行目をファイ ル
2 から読み込んだ内容で置き換える。
Rd 1 番目のファイルの行範囲 R を削除する。例えば ‘5,7d’ はファイル
1 の 5 行目から 7 行目までを削除する。
diff は ed スクリプトのような出力で、かつ各 hunk が forward 方向 (先 頭
か ら末尾へ) のような出力も生成できる。コマンドの形式もちょっと変化して
いる。コマンド文字が、修正する行や行範囲の先に来るのである。また、ピ リ
オ ド 1 つだけの行を特別扱いすることもしない。 ed 形式と同様に、forward
ed 形式も改行していない行を表すことはできない。
forward ed 形式はあまり便利ではない。なぜなら ed も patch もこの形式 の
diff を用いることができないからである。これは主に古いバージョンの diff
との互換性のために存在している。
RCS 形式
RCS 出力形式は Revision Control System (RCS) で用いるために特別に設計さ
れたものである。 RCS はバージョンやシステムの異なるファイルを扱うための
、フリーなプログラムセットである。この形式は forward ed 形式と似てい る
が、ピリオド 1 つの行や改行していない行の問題を回避しているので、ファイ
ル内容の任意の変更を表すことができる。テキストセクションをピリオド 1 つ
の 行で終わるのではなく、それぞれのコマンドで、適用する行数を指定してい
るのである。また ‘c’ コマンドの代わりに ‘a’ と ‘d’ の組み合わせを用いて
いる。さらに 2 番目のファイルの末尾が変更されていて、かつ改行で終わって
いない場合には、出力の末尾も改行されない状態で終わる。
IF-THEN-ELSE
C ソース形式
diff を用いて 2 ファイルの C ソースコードをマージすることもできる。この
出 力形式には、両方のファイルの行がすべて含まれる。両方のファイルに共通
な行は一度しか登場しない。異なる部分は C プリプロセッサの指定を用いて分
離 さ れる。 #ifdef NAME または #ifndef NAME, ,BR #else ", and " #endif
である。出力をコンパイルするとき、マクロ NAME を定義したり、未定義の ま
まにすることによって、どちらのバージョンを使うかを選択できる。
例えば、‘wait (&s)’ というインスタンスを ‘waitpid (-1, &s, 0)’ に変更し
、新旧のファイルを ‘--ifdef=HAVE_WAITPID’ オプションによってマージす る
と、影響を受けた部分のコードは以下のようになるだろう:
do {
#ifndef HAVE_WAITPID
if ((w = wait (&s)) < 0 && errno != EINTR)
#else /* HAVE_WAITPID */
if ((w = waitpid (-1, &s, 0)) < 0 && errno != EINTR)
#endif /* HAVE_WAITPID */
return w;
} while (w != child);
行グループ形式
行 グループ形式を用いると、 if-then-else 入力を受け入れる多くのアプリケ
ーションに適した形式を指定できる。例えばプログラミング言語や文書整形 言
語 などが挙げられる。行グループ形式は、似ている行からなる隣接したグルー
プの出力形式を指定する。
例えば、以下のコマンドは TeX ファイル ‘old’ と ‘new’ を比較し、 old の
部 分 を ‘\begin{em}’-‘\end{em}’ で 囲 み 、 new の 部 分 を
‘\begin{bf}’-‘\end{bf}’ で囲んでマージしたかたちで出力する。
diff \
--old-group-format=’\begin{em}
%<\end{em}
’ \
--new-group-format=’\begin{bf}
%>\end{bf}
’ \
old new
以下のコマンドも上記の例と同じだが、やや記述が多い。デフォルトの行グ ル
ープ形式も指定しているからである。
diff \
--old-group-format=’\begin{em}
%<\end{em}
’ \
--new-group-format=’\begin{bf}
%>\end{bf}
’ \
--unchanged-group-format=’%=’ \
--changed-group-format=’\begin{em}
%<\end{em}
\begin{bf}
%>\end{bf}
’ \
old new
次にもう少し進んだ例を紹介する。これは差分リストを、
"plain English" スタイルで行番号を書いたヘッダとともに出力する。
diff \
--unchanged-group-format=’’ \
--old-group-format=’-------- %dn line%(n=1?:s) deleted at %df:
%<’ \
--new-group-format=’-------- %dN line%(N=1?:s) added after %de:
%>’ \
--changed-group-format=’-------- %dn line%(n=1?:s) changed at %df:
%<-------- to:
%>’ \
old new
行グループ形式を指定するには、 diff を以下のオプションのどれか 1 つを指
定して実行する。 4 つまでの行グループ形式を指定でき、各指定がそれぞれ行
グループ 1 つに対応する。 FORMAT にはシェルのメタキャラクタが入っている
ことが多いので、クォートするべきであろう。
--old-group-format=FORMAT
これらの行グループは 1 番目のファイルだけにある行からな る hunk
で ある。デフォルトの old グループ形式は、changed グループ形式が
指定されていればそれと同じになる。されていなければ行グループはそ
のままのかたちで出力される。
--new-group-format=FORMAT
こ れ らの行グループは 2 番目のファイルだけにある行からなる hunk
である。デフォルトの new グループ形式は、changed グループ形式 が
指定されていればそれと同じになる。されていなければ行グループはそ
のままのかたちで出力される。
--changed-group-format=FORMAT
これらの行グループは両方のファイルの行からなる hunk である。デフ
ォ ルトの changed グループ形式は、 old グループと new グループの
形式を連結したものである。
--unchanged-group-format=FORMAT
これらの行グループは両方のファイルに共通の行からなる hunk である
。 デフォルトの unchanged グループ形式は、行グループをそのままの
かたちで出力するものである。
グループ変換
%< 1 番目のファイルからの行を意味する。行末尾の改行も含む。各 行 は
old 行形式によって整形される。
%> 2 番目のファイルからの行を意味する。行末尾の改行も含む。各行は
new 行形式によって整形される。
%= 両方のファイルで共通な行を意味する。行末尾の改行も含む。各 行 は
unchanged 行形式によって整形される。
%% ‘%’ を表す。
%c’C’’ ここで C は文字 1 文字で、C を表す。 C にバックスラッシュやアポ
ストロフィは指定できない。例えば ‘%c’:’’ はコロンを表し、これ は
if-then-else 形式の then 部分でもコロンとして解釈される。通常は
コロンは then 部分の終わりとして扱われる。
%c’\O’’
ここで 0 は 1 桁から 3 桁までの 8 進数字であり、8 進のコー ド 0
に対応する文字を表す。例えば ‘%c’\0’’ はナル文字になる。
(A=B?T:E)
A が B に等しい場合は T、等しくない場合は E。 A と B はそれぞれ
10 進数の定数か、上記のように解釈される文字 1 つである。この形式
指 定は A の値が B と等しければ T と等価であり、それ以外の場合は
E と等価である。
例えば ‘%(N=0?no:%dN) line%(N=1?:s)’ は N (new ファイルからの グ
ループの行数) が 0 なら ‘no lines’ となり、 N が 1 なら ‘1 line’
となり、それ以外の場合は ‘%dN lines’ となる。
FN ここで F は printf(3) の変換指定で、 N は以下の文字のどれかで あ
る。 「F で整形された N の値」を表す。
e old ファイルからのグループの直前の行の行番号。
f old ファイルからのグループの最初の行番号。e + 1 に等しい
。
l old ファイルからのグループの末尾の行番号。
m old ファイルからのグループの直後の行の行番号。l + 1 に 等
しい。
n old ファイルからのグループの行数。l - f + 1 に等しい。
E, F, L, M, N
上記と同様の new ファイルからのグループのもの。
printf 変換指定には %d, %o, %x, %X (それぞれ 10 進, 8 進, 小文字 16 進,
大文字 16 進) が使える。 ‘%’ の後には以下のオプションを順に指定できる。
‘-’ (左詰めの指定)、整数 (フィールドの最低幅)、ピリオドと数値 (数値は省
略可; 桁数の最小値) である。例えば ‘%5dN’ は new ファイルからのグループ
の 行数を、 5 文字幅のフィールドに、 printf の "%5d" 書式を用いて表示す
る。
行形式
行形式は、入力から取得された各行を if-then-else 形式の行グループとし て
出力される際の制御を行う。
例えば、以下のコマンドは、テキストの左に変更表示の 1 文字を表示してテキ
ストを出力する。出力の最初の桁は、削除行では ‘-’、追加行では ‘|’ となり
、 変更されなかった行ではスペースとなる。この形式では、改行が必要な部分
には改行を入れて出力する。
diff \
--old-line-format=’-%l
’ \
--new-line-format=’|%l
’ \
--unchanged-line-format=’ %l
’ \
old new
行形式を指定するには、以下のオプションのどれかを用いる。 FORMAT には シ
ェ ルのメタキャラクタが入っていることが多いので、クォートするべきであろ
う。
--old-line-format=FORMAT
1 番目のファイルからの行だけを整形する。
--new-line-format=FORMAT
2 番目のファイルからの行だけを整形する。
--unchanged-line-format=FORMAT
両方のファイルに共通の行を整形する。
--line-format=FORMAT
全ての行を整形する。上記の全てのオプションを指定した場合に等しい
。
行形式では、普通の文字はそれ自身を表す。変換指定は ‘%’ で始まり、以下の
形式をとる:
%l 行の内容を意味する。行末尾の改行はあっても含まない。この形式では
、行に改行があるかどうかは無視される。
%L 行の内容を意味する。行末尾の改行があればそれも含む。行に改行がな
ければ、改行はないままになる。
%% ‘%’ を表す。
%c’C’’ ここで C は文字 1 文字で、C を表す。 C にバックスラッシュやア ポ
ス トロフィは指定できない。例えば ‘%c’:’’ はコロンを表し、これは
if-then-else 形式の then 部分でもコロンとして解釈される。通常 は
コロンは then 部分の終わりとして扱われる。
%c’\O’’
こ こ で 0 は 1 桁から 3 桁までの 8 進数字であり、8 進のコード 0
に対応する文字を表す。例えば ‘%c’\0’’ はナル文字になる。
Fn ここで F は printf(3) の変換指定で、 F により整形された行番号 を
表 す。例えば ‘%.5dN’ は行番号を ‘%.5d’ という書式で整形して表示
する。 printf 変換指定の詳細は、上記の行グループ形式のサブセクシ
ョンを見よ。
デ フォルトの行形式は ‘%l’ に改行文字を続けたものである。入力にタブ文字
があり、それが出力行の桁揃えに重要である場合には、‘%l’ や ‘%L’ の行指定
を タブストップの直後に置くとよい (すなわち ‘%l’ や ‘%L’ の前にタブ文字
を置けばよい)。あるいは -t オプションを用いるのもよいだろう。
行形式と行グループ形式を同時に用いると、様々な形式指定が可能となる。 例
え ば、以下のコマンドは diff の通常の形式と似た形式の指定である。これを
修正すれば、diff の出力を微調整することが可能になる。
diff \
--old-line-format=’< %l
’ \
--new-line-format=’> %l
’ \
--old-group-format=’%df%(f=l?:,%dl)d%dE
%<’ \
--new-group-format=’%dea%dF%(F=L?:,%dL)
%>’ \
--changed-group-format=’%df%(f=l?:,%dl)c%dF%(F=L?:,%dL)
%<---
%>’ \
--unchanged-group-format=’’ \
old new
ディレクトリの比較
diff への 2 つの引数がディレクトリだった場合、両方のディレクトリにそ れ
ぞ れのファイルが、ファイル名のアルファベット順に比較される。通常はファ
イルのペアに違いが全くなければ、何も出力しない。しかし -s オプション を
用 いると、同一のファイルも報告する。両方のディレクトリに同名のサブディ
レクトリがあると、通常 diff は報告だけしてサブディレクトリ以下のファ イ
ル は比較しない。しかし -r オプションを用いると、ディレクトリツリーを辿
れる限り、対応する全てのファイルを比較する。
片方のディレクトリだけにあるファイルに対しては、 diff は通常存在する フ
ァ イルの内容を表示せず、ファイルが片方にあって他方にはないことだけを報
告する。 diff の振舞いを変えて、他方のディレクトリにもファイルが空の 状
態 で存在するかのように動作させることもできる。すなわち diff は実際に存
在するファイルの内容をすべて出力する。 (この出力は、ファイルが第 1 ディ
レクトリにあれば削除、第 2 ディレクトリにあれば挿入となる。) この指定に
は -N オプションを使う。
古いほうのディレクトリに大きなファイルがあって、新しいほうにはない場 合
、 -N オプションの代わりに -P オプションを用いるとパッチの大きさを小さ
くできる。 -P オプションは -N オプションと似ているが、第 2 ディレクトリ
にあるファイルの内容だけを出力に挿入し、第 1 ディレクトリだけにあるファ
イルは無視する (すなわち、追加されたファイルだけを扱う)。そして、パッチ
を 当てる前に消去されたファイルを削除するよう、パッチの先頭にパッチを当
てるユーザーへの指示を書く。
ディレクトリの比較時に特定のファイルを無視させるには、 -x PATTERN オ プ
シ ョンを用いる。シェルとは異なり、ファイル名の先頭のピリオドは、パター
ン先頭のワイルドカードにマッチする。シェルによって展開されない よ う 、
PATTERN はクォート記号で囲うべきである。例えば ‘-x ’*.[ao]’’ は ‘.a’ や
‘.o’ で終わる名前のファイルをすべて無視する。このオプションは、複数指定
するとそれぞれが有効になる。例えば ‘-x ’RCS’ -x ’*,v’’ というオプション
を指定すると、ファイル名が ‘RCS’ だったり ‘*,v’ で終わるようなファイ ル
とサブディレクトリをすべて無視する。
返り値
diff は以下の値のどれかで終了する:
0 全く変更がなかった。
1 変更があった。
2 何らかのエラーが起こった。
関連項目
cmp(1), comm(1), diff3(1), ed(1), patch(1), pr(1), sdiff(1)
注意
プログラムのバグについては bug-gnu-utils@gnu.org へ報告してください。ペ
ージの更新は Ragnar Hojland Espinosa
DIFF(1) User Commands DIFF(1)
NAME
diff - compare files line by line
SYNOPSIS
diff [OPTION]... FILES
DESCRIPTION
Compare files line by line.
-i --ignore-case
Ignore case differences in file contents.
--ignore-file-name-case
Ignore case when comparing file names.
--no-ignore-file-name-case
Consider case when comparing file names.
-E --ignore-tab-expansion
Ignore changes due to tab expansion.
-b --ignore-space-change
Ignore changes in the amount of white space.
-w --ignore-all-space
Ignore all white space.
-B --ignore-blank-lines
Ignore changes whose lines are all blank.
-I RE --ignore-matching-lines=RE
Ignore changes whose lines all match RE.
--strip-trailing-cr
Strip trailing carriage return on input.
-a --text
Treat all files as text.
-c -C NUM --context[=NUM]
Output NUM (default 3) lines of copied context.
-u -U NUM --unified[=NUM]
Output NUM (default 3) lines of unified context.
--label LABEL
Use LABEL instead of file name.
-p --show-c-function
Show which C function each change is in.
-F RE --show-function-line=RE
Show the most recent line matching RE.
-q --brief
Output only whether files differ.
-e --ed
Output an ed script.
--normal
Output a normal diff.
-n --rcs
Output an RCS format diff.
-y --side-by-side
Output in two columns.
-W NUM --width=NUM
Output at most NUM (default 130) print columns.
--left-column
Output only the left column of common lines.
--suppress-common-lines
Do not output common lines.
-D NAME --ifdef=NAME
Output merged file to show ‘#ifdef NAME’ diffs.
--GTYPE-group-format=GFMT
Similar, but format GTYPE input groups with GFMT.
--line-format=LFMT
Similar, but format all input lines with LFMT.
--LTYPE-line-format=LFMT
Similar, but format LTYPE input lines with LFMT.
LTYPE is ‘old’, ‘new’, or ‘unchanged’.
GTYPE is LTYPE or ‘changed’.
GFMT may contain:
%< lines from FILE1
%> lines from FILE2
%= lines common to FILE1 and FILE2
%[-][WIDTH][.[PREC]]{doxX}LETTER
printf-style spec for LETTER
LETTERs are as follows for new group, lower case for old group:
F first line number
L last line number
N number of lines = L-F+1
E F-1
M L+1
LFMT may contain:
%L contents of line
%l contents of line, excluding any trailing newline
%[-][WIDTH][.[PREC]]{doxX}n
printf-style spec for input line number
Either GFMT or LFMT may contain:
%% %
%c’C’ the single character C
%c’\OOO’
the character with octal code OOO
-l --paginate
Pass the output through ‘pr’ to paginate it.
-t --expand-tabs
Expand tabs to spaces in output.
-T --initial-tab
Make tabs line up by prepending a tab.
-r --recursive
Recursively compare any subdirectories found.
-N --new-file
Treat absent files as empty.
--unidirectional-new-file
Treat absent first files as empty.
-s --report-identical-files
Report when two files are the same.
-x PAT --exclude=PAT
Exclude files that match PAT.
-X FILE --exclude-from=FILE
Exclude files that match any pattern in FILE.
-S FILE --starting-file=FILE
Start with FILE when comparing directories.
--from-file=FILE1
Compare FILE1 to all operands. FILE1 can be a directory.
--to-file=FILE2
Compare all operands to FILE2. FILE2 can be a directory.
--horizon-lines=NUM
Keep NUM lines of the common prefix and suffix.
-d --minimal
Try hard to find a smaller set of changes.
--speed-large-files
Assume large files and many scattered small changes.
-v --version
Output version info.
--help Output this help.
FILES are ‘FILE1 FILE2’ or ‘DIR1 DIR2’ or ‘DIR FILE...’ or ‘FILE...
DIR’. If --from-file or --to-file is given, there are no restrictions
on FILES. If a FILE is ‘-’, read standard input.
AUTHOR
Written by Paul Eggert, Mike Haertel, David Hayes, Richard Stallman,
and Len Tower.
REPORTING BUGS
Report bugs to
コロナウイルスの日ごとの感染者数・死者数をグラフ化してみました。どの国が増加傾向にあり、どの国が終息に向かっているかを視覚化しています。
Copyright(C) linux-cmd.com All Rights Reserved. Author Takayuki Yukawa