diff是Linux/Unix系统中用于逐行比较两个文件或目录差异的标准工具。它能够精确显示两个文本文件之间的不同之处,是代码审查、配置文件对比、补丁创建和版本控制等领域的基础工具。
diff支持多种输出格式(正常格式、上下文格式、统一格式、并排格式),并提供丰富的过滤选项来忽略特定类型的差异(如大小写、空白字符等)。通过结合patch命令,diff生成的差异文件可以用于在不同系统间传递修改内容。掌握diff是进行文本分析和版本管理的必备技能。
1. 基本用法
| 命令 | 说明 |
|---|
diff file1 file2 | |
diff -u file1 file2 | |
diff -c file1 file2 | |
diff -y file1 file2 | |
diff file1 file2 > file.patch | |
diff -s file1 file2 | |
2. 输出符号说明
3. 目录比较
| 命令 | 说明 |
|---|
diff -r dir1 dir2 | |
diff -rq dir1 dir2 | |
diff -rN dir1 dir2 | |
diff -rNu dir1 dir2 | |
diff -r --exclude=*.log dir1 dir2 | |
diff -r --exclude-dir=.git dir1 dir2 | |
4. 过滤选项
忽略特定类型的差异:
| 选项 | 说明 |
|---|
-i | |
-w | |
-b | |
-B | |
--strip-trailing-cr | |
-E | |
-Z | |
--ignore-matching-lines=REGEX | |
示例:
diff -i file1 file2 # 忽略大小写
diff -w config1.conf config2.conf # 忽略空格差异
diff -B --strip-trailing-cr win.txt linux.txt # 忽略空行和CR差异
5. 常用选项
| 选项 | 说明 |
|---|
-u | |
-c | |
-y | |
-U n | |
-C n | |
-W n | |
-s | |
--color | |
-q | |
-a | |
-d | |
6. 补丁工作流程
diff与patch配合使用,实现修改的保存和恢复:
| 命令 | 说明 |
|---|
diff -u file1 file2 > file.patch | |
diff -rNu dir1 dir2 > dir.patch | |
patch file1 < file.patch | |
patch -p1 < dir.patch | |
patch -R file1 < file.patch | |
patch --dry-run < file.patch | |
patch -b file1 < file.patch | |
补丁级别说明(-pN):
7. 实用组合模式
| 命令 | 说明 |
|---|
diff -u file1 file2 | less | |
diff -rq dir1 dir2 | |
diff --color=always file1 file2 | grep -E '^[+-]' | |
diff -u file1 file2 | grep '^+' | wc -l | |
diff -rN -x "*.o" src/ dest/ | |
git diff --no-index file1 file2 | |
diff -y -W 120 file1 file2 | colordiff | |
8. 输出格式示例
统一格式(-u):
--- file1.txt 2026-04-01 10:00:00
+++ file2.txt 2026-04-01 10:05:00
@@ -1,4 +1,4 @@
line1
-line2
+line2 modified
line3
line4
正常格式(默认):
2c2
< line2
---
> line2 modified
并排格式(-y):
line1 line1
line2 | line2 modified
line3 line3
9. 与其他命令配合
| 命令 | 说明 |
|---|
diff file1 file2 | grep '^<' | wc -l | |
diff file1 file2 | grep '^>' | wc -l | |
diff file1 file2 | grep '^[<>]' | wc -l | |
comm -23 <(sort file1) <(sort file2) | |
diff -u file1 file2 | patch -p0 | |
10. 常用选项速查
| 选项 | 完整名称 | 说明 |
|---|
-u | | |
-c | | |
-y | | |
-r | | |
-q | | |
-s | | |
-i | | |
-w | | |
-b | | |
-B | | |
-N | | |
-x | | |
-X | | |
--color | | |
--strip-trailing-cr | | |
11. 故障排查
| 问题 | 解决方法 |
|---|
| diff显示整个文件不同 | 检查换行符差异(Windows vs Linux),使用--strip-trailing-cr |
| 补丁应用失败(hunk rejected) | 文件版本不匹配;使用-F增加匹配行数;检查补丁格式 |
| 目录比较输出太多 | |
| 空白差异干扰结果 | |
| 二进制文件显示乱码 | diff默认处理文本,使用-a强制文本模式;二进制文件使用cmp |
| 并排输出列宽不足 | |
| 彩色输出不显示 | 使用--color=always;确保终端支持颜色 |
温馨提示: 在代码审查和配置管理场景中,推荐使用统一格式(diff -u),它最易读且是patch工具的标准输入。对于配置文件比较,使用-w忽略空格差异可以避免因缩进格式不同而产生的误报。生成补丁前,建议先用diff -q快速确认文件是否相同。在脚本中使用diff时,可以通过退出码判断文件是否相同(0=相同,1=不同,>1=错误)。对于大型目录的比较,考虑使用rsync -n或find组合替代,效率更高。