Lから始まるLinux

2章43話
evalコマンド
2章44話 差分
もくじ
2章45話
パッチ
差分
若木 みどり
お兄ちゃん! 少しだけ内容が違う 二つのファイルがあるんだ どこが違っているか 調べられないかな?
若木 しげる
もちろんできるよ! 今回はファイルの差分を 確認する方法を覚えよう!
diff コマンド
若木 しげる
diff ファイルの差分を表示するよ difference の略なんだ
diff [オプション]... ファイル...
オプション役割
-u, --unifiedunified diff 形式で出力する(後述)
若木 しげる
diff の基本的な使い方は二つのファイルの比較だよなので ファイル の箇所は通常は二つ指定すると覚えよう
若木 みどり
「比較元」「比較先」二つのファイルになるんだね!
若木 しげる
ここでは差分を出力するために比較する二つのファイルa.txtb.txt を作成しよう!
cat > a.txt << EOF
111
222
333
444
555
666
777
888
999
EOF
cat > b.txt << EOF
111
333
444
555
656
777
888
999
000
EOF
若木 みどり
ヒアドキュメントでファイルを作っているんだねa.txtb.txt微妙に内容が違うみたいだよ
若木 しげる
その違いを diff判定させてみよう!
diff a.txt b.txt
若木 みどり
うん!実行するね!
2d1
< 222
6c5
< 666
---
> 656
9a9
> 000
若木 みどり
複数の行が出力されたよ!二つのファイルの違いを表しているようだけど…
diff 形式
若木 しげる
diff がデフォルトで出力する形式をdiff 形式と呼ぶよ
若木 みどり(笑顔)
そのまんまだね!
若木 しげる
2d16c5 などが差分のある位置を示しているよ
若木 しげる
左の数字が1番目のファイルの行数右の数字が2番目のファイルの行数真ん中の英字がどのような差分かを示しているんだ
英字意味
a追加(append)
d削除(delete)
c変更(change)
若木 しげる
その位置の表す行の下に続いて差分の内容が示されているんだ
記号意味
<1番目のファイルにあり2番目のファイルにない行
>2番目のファイルにあり1番目のファイルにない行
若木 みどり
さっきの diff の出力は差分の位置を表す行が三つあるね!ということはこれらを区切りにして以下の三つの差分を表しているんだ!
2d1
< 222
6c5
< 666
---
> 656
9a9
> 000
若木 しげる
そういうことだね一つずつ差分の出力内容を見ていこう!

2d1
< 222
若木 みどり
d は delete だったよね2番目のファイルと比較すると1番目のファイルから行がなくなっているんだ!
若木 しげる
そうだね1番目のファイルの2行目から222 という行がなくなっていることを表しているよ!2番目のファイルではその位置は1行目ということだね

6c5
< 666
---
> 656
若木 みどり
c は change で「変更」だったよね!
若木 しげる
--- は見やすくするための区切りだよ1番目のファイル6行目の 6662番目のファイル5行目の 656それぞれ変わっていることを表しているよ

9a9
> 000
若木 みどり
a は append ね1番目のファイルには無いけど2番目のファイルに行が追加されているんだ!
若木 しげる
そのとおり!1番目のファイルの9行目の位置に2番目のファイルの9行目の 000追加されていることを表しているよ
若木 みどり
読み方さえ分かればテキストだけでシンプルに差分を表現してくれているとわかるね!
まとめ
若木 みどり
今回は diff二つのファイルの差分を確認できると学んだよ!
若木 しげる(笑顔)
最初にみどりが困っていたように2つファイルの違いを調べる用途なら大抵どんなことにも使えるよ!
若木 しげる
よく使われる場面は設定変更の確認だよオリジナルの設定からどんな変更をしたかを調べるのに便利なんだ!