Linuxコマンド一覧

diffコマンド|2つのファイルの違いを出す

__ __ _ _____
\ \ / /__| |_|_ _|__ _ __ _ __ ___
\ \ /\ / / _ \ '_ \| |/ _ \ '__| '_ ` _ \
\ V V / __/ |_) | | __/ | | | | | |
\_/\_/ \___|_.__/|_|\___|_| |_| |_| |_
 
diff を試すためのサンドボックスです。実機のファイルには影響しません。
user@webterm:~/project$
 

diff は2つのファイルの違いを行単位で表示するコマンドです。`<` と `>` の読み方、`-u` と `-y` の見やすい形式、同じかどうかだけ知りたいときの `-q` を、ブラウザ上のターミナルで打ちながら確認できます。

最終更新: 2026-09-06

書式

diff [オプション] ファイル1 ファイル2

2つのファイルを行単位で比べ、違うところだけを出します。

まず打ってみる

設定ファイルを書き換えた後、控えと見比べる場面です。

$ cat site.conf.bak
server_name localhost
listen 80
root /var/www/html
gzip off
$ cat site.conf
server_name example.com
listen 80
root /var/www/html
gzip on
client_max_body_size 10m

違いを出します。

$ diff site.conf.bak site.conf
1c1
< server_name localhost
---
> server_name example.com
4c4,5
< gzip off
---
> gzip on
> client_max_body_size 10m

読み方は3つ覚えれば足ります。

記号意味
<1つ目のファイルの行
>2つ目のファイルの行
1c11行目が変更された(c は change)

a は追加、d は削除です。 4c4,5 は「1つ目の4行目が、2つ目の4〜5行目に変わった」という意味になります。

見やすい形式にする

-u を付けると、前後の行も含めた形式になります。

$ diff -u site.conf.bak site.conf
--- site.conf.bak
+++ site.conf
@@ -1,4 +1,5 @@
-server_name localhost
+server_name example.com
 listen 80
 root /var/www/html
-gzip off
+gzip on
+client_max_body_size 10m

- が消えた行、+ が増えた行、印の無い行は変わっていない行です。 git が出す差分と同じ形式なので、見慣れているならこちらが速いです。

左右に並べたいときは -y です。

$ diff -y site.conf.bak site.conf
server_name localhost                              | server_name example.com
listen 80                                            listen 80
root /var/www/html                                   root /var/www/html
gzip off                                           | gzip on
                                                   > client_max_body_size 10m

| が変わった行、> が2つ目にだけある行です。

同じかどうかだけ知る

同じファイルを比べると、何も出ません。

$ diff a.txt b.txt
$ echo $?
0

違いがあるときだけ出力されるのが diff の約束です。 中身ではなく「違うかどうか」だけ知りたいときは -q を使います。

$ diff -q site.conf.bak site.conf
Files site.conf.bak and site.conf differ
$ echo $?
1

終了コードは、同じなら 0、違えば 1 です。 スクリプトの中で分岐したいときは、この値を見ます。

実務での使いどころ

diff は、「変えたつもり」と「実際に変わったもの」を突き合わせるときに打つコマンドです。

場面打ち方
書き換えた設定を控えと見比べるdiff site.conf.bak site.conf
git と同じ形式で見るdiff -u 古い 新しい
左右に並べて見るdiff -y 古い 新しい
違うかどうかだけ知るdiff -q 古い 新しい
大文字と小文字の違いを無視するdiff -i a.txt b.txt

sed -i.bak で残した控えと突き合わせると、置換の結果をそのまま確認できます。

つまずきやすいところ

引数の順番で <> の意味が入れ替わります。 diff 古い 新しい の順に渡すのが慣習です。 逆にすると、追加と削除が反転して読めます。

何も出ないのは成功です。 出力が無いときは同じ、というだけです。 エラーではないので、心配せず次に進んでください。

ファイルが無いときは、そう言われます。

$ diff nothing.txt a.txt
diff: nothing.txt: No such file or directory

2つ渡さないと動きません。

$ diff site.conf
diff: missing operand

手を動かして覚える

webterm.appこのサイト

learn.webterm.app別のサイト

>_WEBTERM LEARN

WebTerm Learn|1つのコマンドから、使える状態へ

コマンドは単体で覚えるより、実際の作業の流れの中で使うほうが身につきます。順番に積み上げていくコースがあります。

コースを見る

関連するコマンド

git / cat / sed / less

よくある質問

`<` と `>` はどちらのファイルですか?
`<` が1つ目、`>` が2つ目です。`diff 古い 新しい` の順で渡すと、`<` が変更前、`>` が変更後になります。
`1c1` や `4c4,5` は何を表していますか?
変更した行の位置です。`c` は change(変更)、`a` は add(追加)、`d` は delete(削除)で、その前後の数字が両方のファイルの行番号です。
何も出ないときは失敗ですか?
いいえ、2つのファイルが同じという意味です。diff は違いがあるときだけ出力し、終了コードも同じなら0、違えば1になります。
`-u` は何のために付けますか?
前後の行を含めた形式(unified diff)になり、どこの話なのかが分かります。git やパッチが使うのもこの形式です。
git diff とは何が違いますか?
`diff` は指定した2つのファイルを比べます。`git diff` は「記録した状態」と「いまの状態」を比べるもので、比較する相手を自分で選ぶ必要がありません。手元にある控えと見比べたいときは diff です。