diff の出力は
変更前と変更後の
二つのファイルの「違い」を
表すファイルだよね?
そのとおり!
変更前のファイルとパッチから
変更後のファイルを
作ることができるんだ
今回はそんなパッチの
扱いを学んでいこう!
前回は以下のコマンドで
比較するための二つのファイル
a.txt と b.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
それではこれらの差分をパッチ
ab.patch にしよう!パッチは unified diff 形式が一般的だよ
-u オプションを指定して出力しようdiff -u a.txt b.txt > ab.patch
うん!出力したよ!中身はこんな感じみたい…
cat ab.patch
--- a.txt 2025-05-12 17:25:22.302944148 +0900
+++ b.txt 2025-05-12 17:25:38.967887343 +0900
@@ -1,9 +1,9 @@
111
-222
333
444
555
-666
+656
777
888
999
+000
行の先頭に
+ や - があって書式を詳しく知らなくてもどのような変化があったか直感的にわかりやすいね!出力の先頭を見てみよう!diff 形式との大きな違いは比較した二つのファイル名が出力に含まれていることだよ
言われてみれば…!diff 形式は差分内容しか出力されていなかったね
patch コマンドこのパッチ
ab.patch をa.txt に反映させるにはどうすればいいのかな?patch はファイルにパッチを適用するよ書式で覚えるよりも入力リダイレクトで使うと覚えよう!以下のように実行してみてね
patch < ab.patch
どれどれ?
patching file a.txt
a.txt ファイルにパッチを当てています」unified diff 形式の内容にはファイル名も含まれているのでパッチファイルを入力リダイレクトするだけで処理してくれるんだよ
もう
a.txt の内容はパッチが当てられたのかな?それは中身を表示させて確認してみよう!
cat a.txt
うん!
111
333
444
555
656
777
888
999
000
変更されたっぽいけど内容は合っているのかな?
せっかく
diff を覚えたのだからパッチを当てた a.txt とb.txt を比較してみようちゃんとパッチが当たっていれば二つのファイル内容に差はないはずだよ
おー!人間の目で見比べるとミスが怖いよね機械的に処理できるのなら
diff に任せよう!diff a.txt b.txt
うん!何も表示されない!ということは差が無いんだね!ちゃんとパッチが当たっていたよ
今回はパッチの扱いを学んだよ!
diff の -u オプションでunifided diff 形式のパッチを出力してpatch でパッチを適用できるんだ!ソフトウェア配布などではパッチも一緒に提供されていることがあるよ大元のファイルが手元にあればパッチをダウンロードして適用するだけで新しいバージョンにすることができるんだ