diff 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,属于文本处理命令族(见文本处理命令族)。"这两个文件哪里不一样"第一反应就是它。
diff 逐行比较两个文件(或目录),输出"怎么把 A 变成 B"的修改说明。它是生成补丁(patch)的基础工具。
一、基本用法与输出解读
bash
diff old.txt new.txt
# 输出示例:
# 3c3 表示第 3 行变了(change)
# < old line < 是旧文件内容
# --- 分隔
# > new line > 是新文件内容
# 5a6 表示旧文件第 5 行后追加(append)了新文件第 6 行
# 2d1 表示删(delete)旧文件第 2 行(对应新文件第 1 行)默认输出是"ed 风格"指令:
a(add)/c(change)/d(delete) 加行号,可读性一般。日常更推荐-u统一格式。
二、统一格式:-u(最常用)
bash
diff -u old.txt new.txt # 上下文格式,@@ 标变化位置
diff -u old.txt new.txt > fix.patch # 生成补丁
-u(unified)输出带-(删)/+(加) 和上下文行,人眼一眼看懂,也是git diff的格式基础。生成的.patch可用 patch 命令应用(见patch)。
三、比较目录:-r
bash
diff -r dirA dirB # 递归比较两目录所有文件
diff -rq dirA dirB # -q 只报"是否不同"、不显内容
-r递归比目录树;-q(brief)只说"这两个文件不同"不打印细节,快速找出哪些文件有改动。配合-x可排除某些文件。
四、与 comm / vimdiff 的区别
bash
comm a.txt b.txt # 三列输出:仅在A/仅在B/共有(需先 sort)
vimdiff a.txt b.txt # 交互并排高亮(vim 内)
diff -u a.txt b.txt # 纯文本、可生成 patchcomm 适合"找交集/差集"(需先排序);
vimdiff是交互可视化;diff -u是脚本/补丁场景的标准。要生成可应用的补丁只能选diff。
相关命令
一句话总结
diff = 逐行比较差异:默认输出 a/c/d 指令难读,用 diff -u(统一格式,git diff 同源)最直观且能生成 patch;diff -r 递归比目录、-q 只报是否不同;与 comm(找交集/差集,需先 sort)、vimdiff(交互高亮)分工不同;生成补丁用 diff -u > x.patch 再 patch 应用。