/Linuxコマンド

テキスト処理

比較とパッチ

diff・patch・cmp で、2つのファイルやディレクトリの違いを調べて当てる。

diff違いを表示する

2つのファイルやフォルダを比べて、違うところを表示します。

オプション意味
-u前後3行も含めた「unified形式」(パッチやgitと同じ見た目)
-rディレクトリを再帰的に比べる
-q違うかどうかだけ表示
-y左右に並べて表示(-W 160 で幅を指定)
-w / -b空白の違いを無視 / 空白の数の違いを無視
-i大文字小文字を無視
--color色を付ける
bash
$ diff -u old.conf new.conf
$ diff -u --color old.conf new.conf | less -R
$ diff -rq dir1/ dir2/               # 違うファイルの名前だけ
$ diff -y -W 120 a.txt b.txt
$ diff <(ls dir1) <(ls dir2)         # コマンドの出力どうしを比べる

unified 形式の読み方:

出力
--- old.conf	2026-09-24
+++ new.conf	2026-09-25
@@ -3,4 +3,4 @@
listen 80;
-server_name old.example.com;
+server_name new.example.com;
root /var/www;

- で始まる行が消えた行、+ で始まる行が増えた行です。

patch差分を当てる

diff で作った差分(パッチ)をファイルに当てて、同じ変更を再現します。

bash
$ diff -u original.c fixed.c > fix.patch
$ patch original.c < fix.patch
$ patch -p1 < changes.patch          # パスの先頭1階層を外して当てる(gitの差分は -p1)
$ patch -p1 --dry-run < changes.patch  # 実際には当てずに試す
$ patch -R -p1 < changes.patch       # 当てた差分を戻す

cmpバイナリを含めて一致するか比べる

2つのファイルが同じかどうかを、バイナリも含めて1バイトずつ比べます。

bash
$ cmp a.bin b.bin
a.bin b.bin differ: byte 1025, line 3
$ cmp -s a.bin b.bin && echo 同じ

sdiff左右に並べて比べる

2つのファイルを左右に並べて比べます。

bash
$ sdiff -s old.txt new.txt           # 違う行だけ並べて表示