【diff】Linuxコマンド_2つのファイルデータの差分を表示する

2つのファイルデータの内容の差分を調べる際には「diff」コマンドを使用します。




↓↓↓ITエンジニアのおすすめ学習・開発環境の詳細へ↓↓↓

「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エンジニアが自宅で学習ができるオンラインスクール比較

エンジニアのおすすめ学習「Progate」と「Udemy」比較

VPS_比較
最新情報をチェックしよう!