順番に読み進めながら学べます

ファイルの差分 — diff

この記事は、基礎コマンドからシェルスクリプトまでLinuxの実践的なスキルを1からマスターする「Linux入門講座の一部」です。
diff を使って 2 つのファイルの差分を確認する方法を見ていきます。どの行が追加・削除・変更されたのかを、図解とブラウザ端末で実際に手を動かしながら確認します。

diff はこんなときに使います

ファイルを編集してどこを変えたか確かめたいとき、ファイルの内容が一致するか確かめたいときに使います。2 つのファイルを渡すと、違う行だけを表示してくれます。

2 つのファイルを比べる — diff

diffは 2 つのファイルを比較し、違う部分だけを表示するコマンドです。diff old.txt new.txtの形で使い、1 つ目を変更前(旧)、2 つ目を変更後(新)として突き合わせます。同じ行は出力されず、違いのある箇所だけが報告されます

diff で 2 つのファイルを比べる
old.txtapple / banana / cherrynew.txtapple / grape / cherrydiff出力-banana+grape差分を表示比較する 2 ファイル
diff old.txt new.txtは 2 つのファイルを突き合わせ、違う 2 行目だけを-banana(旧)と+grape(新)として表示します。同じapplecherryは出力されません。

ブラウザ端末のdiffは、違いを統一形式(unified format)で表示します。先頭の---+++が比較した 2 つのファイル名、@@の行が変更の起きた位置を示し、本体では削除された行に-、追加された行に+が付きます。変わらない行は先頭にスペースが付いて、文脈として一緒に表示されます。

記号意味
--- old.txt比較した 1 つ目(旧)のファイル名
+++ new.txt比較した 2 つ目(新)のファイル名
@@ -N,M +N,M @@変更が起きた行位置の情報
- 行削除された行(旧ファイルにあった行)
+ 行追加された行(新ファイルにある行)
(先頭スペース)変わらず文脈として一緒に出る行
統一形式の読み方
削除された行(旧ファイル)@@ -1,3 +1,3 @@変更が起きた位置を示す- banana+ grape追加された行(新ファイル)
統一形式では、@@が変更位置、-が削除された行(旧)、+が追加された行(新)を示します。変わらない行は先頭スペース付きで一緒に表示されます。
printf 'apple\nbanana\ncherry\n' > old.txt   # 素材を作成
printf 'apple\ngrape\ncherry\n' > new.txt    # 1 行だけ違う素材
diff old.txt new.txt
--- old.txt
+++ new.txt
@@ -1,3 +1,3 @@
 apple
-banana
+grape
 cherry

printf 'apple\nbanana\ncherry\n' > old.txtで 1 つ目の素材ファイルを作成してください。

printf 'apple\ngrape\ncherry\n' > new.txtで 2 行目だけ違う 2 つ目の素材ファイルを作成してください。

diffに 2 つのファイルをこの順で渡して比較し、削除行の-と追加行の+がどの行に付くかを読み取ってください。(正しく実行できれば解説が表示されます)

Linux console
0 / 3 実行済み
Loading Linux Terminal...

追加と削除を読む

違いは書き換えだけではありません。右ファイルにだけ行が増えたときは+の行だけが、左ファイルから行が消えたときは-の行だけが出ます。書き換えのときのように-+が対で並ぶのではなく、片方だけが現れるのが追加・削除の目印です。比較する向きを入れ替えると、同じ違いが+(追加)と-(削除)で逆になります。

printf 'one\ntwo\n' > base.txt        # 素材を作成
printf 'one\ntwo\nthree\n' > more.txt  # 1 行追加した素材
diff base.txt more.txt
--- base.txt
+++ more.txt
@@ -1,2 +1,3 @@
 one
 two
+three
比較の向きで + と - が入れ替わる
diffbase.txt more.txt向きを変えると+ と - が反転diffmore.txt base.txt+ three(追加)- three(削除)+ が出る- が出る
同じ 2 ファイルでも、diff base.txt more.txtでは+three(追加)、向きを変えたdiff more.txt base.txtでは-three(削除)として出ます。

printf 'one\ntwo\n' > base.txtで 2 行の 1 つ目の素材を作成してください。

printf 'one\ntwo\nthree\n' > more.txtで 3 行目を足した 2 つ目の素材を作成してください。

diffbase.txtmore.txt の順に比較し、追加された行の先頭に+が付くことを確認してください。

④ 続けて more.txtbase.txt と順番を逆にして比較し、同じ違いが-(削除)として出ること、向きで+-が入れ替わることを確認してください。

Linux console
0 / 4 実行済み
Loading Linux Terminal...

diff と patch、他環境での表示

diffが出力するこの統一形式の差分は、patchコマンドで別のファイルにそのまま適用できます。チームでの修正のやり取りでは、この差分(パッチ)を渡し合うのが一般的です。本講座では差分の読み方に絞って学び、適用の操作はここでは扱いません。

本講座のブラウザ端末ではdiffがそのまま統一形式を出力します。Ubuntu などの GNU diff では、diffだけだと2c2< / >を使った従来形式で表示され、diff -uを付けると本講座と同じ統一形式になります。

QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1diffの統一形式の出力で、削除された(旧ファイルにあった)行の先頭に付く記号はどれですか?

Q2@@ -1,3 +1,3 @@のような行は何を示しますか?

Q3右ファイルにだけ行が増えたとき、diffの出力はどうなりますか?