1. 命令概述
- 命令名称:
diff (英文全拼:difference)
- 核心功能:逐行比较两个文件或目录的差异
- 主要用途:文本文件差异对比、代码版本比较、配置文件变更检查
2. 语法格式
# 比较两个文件
diff [选项] 文件1 文件2
# 比较两个目录
diff [选项] 目录1 目录2
3. 常用选项
| 选项 | 说明 |
|---|
-c | 上下文模式,显示差异前后的若干行 |
-u | 统一模式(unified),显示差异的上下文,最常用 |
-i | 忽略大小写差异 |
-w | 忽略所有空白字符(空格、制表符等) |
-b | 忽略行尾的空白字符 |
-B | 忽略空白行的差异 |
-r | 递归比较目录 |
-q | 静默模式,只显示文件是否不同,不显示具体差异 |
-s | 显示两个文件相同的消息 |
-y | 并排显示差异 |
-W | 设置并排显示的宽度 |
--help | 显示帮助信息 |
--version | 显示版本信息 |
4. 输出格式说明
(1) 默认输出格式
N1,N2cN3,N4
< 文件1的内容
---
> 文件2的内容
N1,N2cN3,N4:表示文件1的 N1 到 N2 行需要修改为文件2的 N3 到 N4 行
a:添加(append)
d:删除(delete)
c:修改(change)
(2) 统一模式(-u)输出格式
--- 文件1 时间戳
+++ 文件2 时间戳
@@ -N1,N2 +N3,N4 @@
- 文件1被删除的行
+ 文件2新增的行
两个文件共有的行
-N1,N2:文件1的起始行和行数
+N3,N4:文件2的起始行和行数
-:文件1有但文件2没有的行
+:文件2有但文件1没有的行
- 没有符号:两个文件共有的行
5. 常用实例详解
(1) 基本文件比较
# 比较两个文件
diff file1.txt file2.txt
(2) 统一模式(最常用)
# 使用统一模式显示差异
diff -u file1.txt file2.txt
(3) 上下文模式
# 显示差异前后的3行上下文
diff -c file1.txt file2.txt
(4) 并排显示差异
# 并排显示差异,设置宽度为80字符
diff -y -W 80 file1.txt file2.txt
(5) 忽略空白差异
# 忽略所有空白字符差异
diff -w file1.txt file2.txt
# 忽略行尾空白
diff -b file1.txt file2.txt
(6) 比较目录
# 比较两个目录
diff dir1 dir2
# 递归比较目录
diff -r dir1 dir2
(7) 静默模式(脚本中使用)
# 只判断文件是否不同,不显示具体差异
diff -q file1.txt file2.txt
if [ $? -eq 0 ]; then
echo "文件相同"
else
echo "文件不同"
fi
6. 实际应用场景
场景一:代码版本比较
# 比较两个版本的代码文件
diff -u old_version.py new_version.py
# 生成补丁文件
diff -u old_version.py new_version.py > patch.diff
# 应用补丁
patch old_version.py < patch.diff
场景二:配置文件变更检查
# 比较当前配置和备份配置
diff -u /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
# 忽略空白差异
diff -w /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
场景三:目录同步检查
# 检查两个目录是否同步
diff -r /backup/source/ /backup/destination/
# 只显示不同文件,不显示具体差异
diff -rq /backup/source/ /backup/destination/
场景四:生成补丁文件
# 生成补丁文件
diff -Naur old_dir/ new_dir/ > mypatch.patch
# 应用补丁
patch -p1 < mypatch.patch
7. 与其他比较命令的区别
| 命令 | 比较方式 | 输出格式 | 适用场景 |
|---|
diff | 逐行比较 | 差异上下文 | 文本文件、代码比较 |
cmp | 逐字节比较 | 字节位置 | 二进制文件、精确比较 |
comm | 逐行比较 | 三列输出 | 找出共同行和独有行 |
8. 注意事项
- 输出重定向:
diff 的输出可以重定向到文件生成补丁
- 退出状态码:0(相同)、1(不同)、2(错误)
- 大文件:对于非常大的文件,
diff 可能会比较慢
- 二进制文件:
diff 不适合比较二进制文件,应使用 cmp
- 补丁应用:使用
patch 命令应用 diff 生成的补丁文件
核心要点总结:
diff 用于逐行比较文本文件的差异
-u 选项(统一模式)是最常用的输出格式
-r 选项用于递归比较目录
- 输出可以重定向生成补丁文件,使用
patch 命令应用
- 退出状态码:0(相同)、1(不同)、2(错误)
- 适合代码版本比较、配置文件变更检查等场景