2つのファイルデータの内容の差分を調べる際には「diff」コマンドを使用します。
「diff」コマンドの使い方(Linux)
以下のように、「file01.txt」と「file02.txt」という2つのファイルがあるとします。
※file01.txt
$ cat file01.txt fukuoka saga kumamoto
※file02.txt
$ cat file02.txt fukuoka saga miyazaki
この2つのファイル内のデータの差分を調べ表示するために以下のコマンドを実行します。
$ diff file01.txt file02.txt 3c3 < kumamoto --- > miyazaki
「diff」コマンドで第1引数と第2引数である「file01.txt」と「file02.txt」を指定し、2つのファイル内のデータの差分を調べて表示します。
また、「diff」コマンドで表示された冒頭の「3c3」という箇所では、はじめの「3」はfile01.txtの3行目、最後の「3」はfile02.txtの3行目を表しています。
間の「c」は「change(交換)」という意味となります。
unified diff(ユニファイド・ディフ)形式での表示
diffコマンドでは人によっては以下のような「unified diff形式」を好む方もいます。
「unified diff形式」は差分(修正箇所の)前後の数行を含み、差分箇所を「-」と「+」で表示してくれます。
デフォルトの表示よりも修正箇所がわかりやすく、業務などでもよく使用されます。
# diff -u file01.txt file02.txt --- file01.txt 2021-10-03 20:43:26.330000000 +0900 +++ file02.txt 2021-10-03 20:43:41.597000000 +0900 @@ -1,3 +1,3 @@ fukuoka saga -kumamoto +miyazaki
現在の「diff」コマンドではこれが一般的に使用されることが多いです。
「diff」ディレクトリ単位の差分表示
「diff」コマンドでは異なるディレクトリにある同じ名前のフィル同士の差分を調べることもできます。
以下では「dir01」と「dir02」配下のファイルの差分を表示した結果となります。
$ diff dir01 dir02 diff dir01/file01.txt dir02/file01.txt 3c3 < kumamoto --- > oita Only in dir02: file02.txt
2つのディレクトリ配下で同じファイル「file01.txt」の差分が表示されます。
また、別途7行目で「Only in dir02: file02.txt」と表示されます。
これは、「dir01」配下に存在しないファイル「file02.txt」が「dir02」配下に存在することを表示しています。
ディレクトリ単位で「diff」コマンドを実行した場合、以下のような動作となります。
- 同じファイルが存在する場合は中身のデータの差分を表示
- 異なるファイルが存在する場合はファイル名を表示
「unified diff形式」で表示した場合は以下のように表示されます。
$ diff -u dir01 dir02 diff -u dir01/file01.txt dir02/file01.txt --- dir01/file01.txt 2021-10-03 11:50:06.632391968 +0000 +++ dir02/file01.txt 2021-10-03 12:04:15.692136953 +0000 @@ -1,3 +1,3 @@ fukuoka saga -kumamoto +oita Only in dir02: file02.txt
「diff」コマンドオプション
「diff」コマンドのオプションは以下の通りとなります。
$ diff --help 使用法: diff [OPTION]... FILES FILES を行ごとに比較します。 長い形式のオプションで必須の引数は、それに対応する短い形式のオプションでも同様に必須です。 --normal 通常の diff を出力する (デフォルト) -q, --brief ファイルが異なるかどうかのみ表示する -s, --report-identical-files 両方のファイルが同一であるかどうかのみ表示する -c, -C NUM, --context[=NUM] コンテキスト diff 形式で前後 NUM (デフォルト: 3) 行を表示する -u, -U NUM, --unified[=NUM] ユニファイド diff 形式で前後 NUM (デフォルト: 3) 行を表示する -e, --ed ed スクリプトを出力する -n, --rcs RCS 形式の diff を出力する -y, --side-by-side 出力を2列にする -W, --width=NUM 表示する列を最大 NUM (デフォルト: 130) 列にする --left-column 共通行は左側の列のみ表示する --suppress-common-lines 共通行の出力を抑止する -p, --show-c-function 変更がある C 関数を表示する -F, --show-function-line=RE RE に一致する最も近い行を表示する --label LABEL use LABEL instead of file name and timestamp (can be repeated) -t, --expand-tabs 出力時にタブをスペースに展開する -T, --initial-tab タブで始まる行は、前にタブを置いてそろえる --tabsize=NUM タブ幅を NUM (デフォルト: 8) 列に設定する --suppress-blank-empty 空の出力行の前後ではスペースまたはタブを抑止する -l, --paginate pass output through 'pr' to paginate it -r, --recursive サブディレクトリーを再帰的に比較する --no-dereference don't follow symbolic links -N, --new-file 存在しないファイルを空ファイルとして扱う --unidirectional-new-file 存在しない最初のファイルを空ファイルとして扱う --ignore-file-name-case ファイル名の大文字と小文字を区別しない --no-ignore-file-name-case ファイル名の大文字と小文字を区別する -x, --exclude=PAT PAT に一致するファイルを除外する -X, --exclude-from=FILE FILE 内のパターンに一致するファイルを除外する -S, --starting-file=FILE ディレクトリーを比較する時に FILE から始める --from-file=FILE1 すべての被演算子と FILE1 を比較する FILE1 はディレクトリーでもよい --to-file=FILE2 すべての被演算子を FILE2 を比較する FILE2 はディレクトリーでもよい -i, --ignore-case ファイル内容の比較時に大文字と小文字を区別しない -E, --ignore-tab-expansion タブ展開によって発生する違いを無視する -Z, --ignore-trailing-space 行末にあるスペースを無視する -b, --ignore-space-change スペース数により生じる違いを無視する -w, --ignore-all-space すべてのスペースを無視する -B, --ignore-blank-lines ignore changes where lines are all blank -I, --ignore-matching-lines=RE ignore changes where all lines match RE -a, --text すべてのファイルをテキストとして扱う --strip-trailing-cr 入力から CR (キャリッジリターン) を除去する -D, --ifdef=NAME output merged file with '#ifdef NAME' diffs --GTYPE-group-format=GFMT GTYPE の入力グループを GFMT で整形する --line-format=LFMT すべての入力行を LFMT で整形する --LTYPE-line-format=LFMT LTYPE 入力行を LFMT で整形する これらの書式整形オプションは -D/--ifdef に適用される diff の出力をきれいに 見えるように制御するために提供されます。 LTYPE is 'old', 'new', or 'unchanged'. GTYPE is LTYPE or '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 %(A=B?T:E) A と B が等しい場合は T、等しくない場合は E LFMT でのみ指定できる書式: %L 行の内容 %l 行末にあるすべての種類の改行文字を除いた行の内容 %[-][WIDTH][.[PREC]]{doxX}n printf 書式の入力行 GFMT と LFMT の両方で指摘できる書式: %% % %c'C' 単一文字 C %c'\OOO' 八進数コード OOO C 文字 C (他の文字も同様に表す) -d, --minimal 差分の大きさが最小となるように違いを検出する --horizon-lines=NUM 差分の前後にある共通部分を NUM 行保持する --speed-large-files 巨大なファイルに小さな差分が分散していると仮定する --color[=WHEN] colorize the output; WHEN can be 'never', 'always', or 'auto' (the default) --palette=PALETTE the colors to use when --color is active; PALETTE is a colon-separated list of terminfo capabilities --help このヘルプを表示して終了する -v, --version バージョン情報を表示して終了する FILES are 'FILE1 FILE2' or 'DIR1 DIR2' or 'DIR FILE' or 'FILE DIR'. --from-file または --to-file が与えられた場合、FILE に制限はありません。 If a FILE is '-', read standard input. 終了コードは、入力ファイルが同じ場合は 0、入力ファイルが異なる場合は 1、 問題が発生したときは 2 になります。 バグを発見したら <bug-diffutils@gnu.org> に報告して下さい。 翻訳に関するバグは<translation-team-ja@lists.sourceforge.net>に報告してください。 GNU diffutils のホームページ: <http://www.gnu.org/software/diffutils/> GNU ソフトウェアを使用する際の一般的なヘルプ: <http://www.gnu.org/gethelp/>
「diff」コマンドの使い方は以上となります。
エンジニアのオンライン学習
エンジニアにおすすめのオンライン教材比較 | |
ITエンジニアが自宅で学習ができるオンラインスクール比較 | |