Q1diffの統一形式の出力で、削除された(旧ファイルにあった)行の先頭に付く記号はどれですか?
ファイルの差分 — diff
この記事は、基礎コマンドからシェルスクリプトまでLinuxの実践的なスキルを1からマスターする「Linux入門講座の一部」です。
diff を使って 2 つのファイルの差分を確認する方法を見ていきます。どの行が追加・削除・変更されたのかを、図解とブラウザ端末で実際に手を動かしながら確認します。
diff はこんなときに使います
ファイルを編集してどこを変えたか確かめたいとき、ファイルの内容が一致するか確かめたいときに使います。2 つのファイルを渡すと、違う行だけを表示してくれます。
2 つのファイルを比べる — diff
diffは 2 つのファイルを比較し、違う部分だけを表示するコマンドです。diff old.txt new.txtの形で使い、1 つ目を変更前(旧)、2 つ目を変更後(新)として突き合わせます。同じ行は出力されず、違いのある箇所だけが報告されます。
diff old.txt new.txtは 2 つのファイルを突き合わせ、違う 2 行目だけを-banana(旧)と+grape(新)として表示します。同じappleとcherryは出力されません。ブラウザ端末のdiffは、違いを統一形式(unified format)で表示します。先頭の---と+++が比較した 2 つのファイル名、@@の行が変更の起きた位置を示し、本体では削除された行に-、追加された行に+が付きます。変わらない行は先頭にスペースが付いて、文脈として一緒に表示されます。
| 記号 | 意味 |
|---|---|
--- old.txt | 比較した 1 つ目(旧)のファイル名 |
+++ new.txt | 比較した 2 つ目(新)のファイル名 |
@@ -N,M +N,M @@ | 変更が起きた行位置の情報 |
- 行 | 削除された行(旧ファイルにあった行) |
+ 行 | 追加された行(新ファイルにある行) |
行(先頭スペース) | 変わらず文脈として一緒に出る行 |
@@が変更位置、-が削除された行(旧)、+が追加された行(新)を示します。変わらない行は先頭スペース付きで一緒に表示されます。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 '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
diff base.txt more.txtでは+three(追加)、向きを変えたdiff more.txt base.txtでは-three(削除)として出ます。diff と patch、他環境での表示
diffが出力するこの統一形式の差分は、patchコマンドで別のファイルにそのまま適用できます。チームでの修正のやり取りでは、この差分(パッチ)を渡し合うのが一般的です。本講座では差分の読み方に絞って学び、適用の操作はここでは扱いません。
本講座のブラウザ端末ではdiffがそのまま統一形式を出力します。Ubuntu などの GNU diff では、diffだけだと2c2や< / >を使った従来形式で表示され、diff -uを付けると本講座と同じ統一形式になります。
理解度チェック
まずは1問ずつ答えてみましょう。
Q2@@ -1,3 +1,3 @@のような行は何を示しますか?
Q3右ファイルにだけ行が増えたとき、diffの出力はどうなりますか?