Linux `diff` 命令详解
🐧 Linux diff 命令详解
学习目标
- 理解
diff命令的基本功能与原理 - 掌握
diff的常用选项及其在文件对比、版本控制中的实际应用 - 能够结合
patch、vimdiff等工具进行代码差异分析和修复
核心重点(Key Points)
| 主题 | 内容 |
|---|---|
| 命令名称 | diff |
| 功能 | 对比两个文件或目录的差异 |
| 底层机制 | 使用最长公共子序列算法(LCS)找出最小修改路径 |
| 常见用途 | 版本控制、配置备份比较、脚本调试、自动化测试等 |
| 支持平台 | 所有主流 Linux 发行版(Ubuntu/CentOS/EulerOS/Debian 等) |
| 典型命令 | diff file1 file2diff -r dir1 dir2diff -u file1 file2 |
详细讲解
🔍 一、什么是 diff 命令?
diff 是一个用于比较两个文件或目录内容差异的命令行工具。它广泛应用于:
- 查看文本文件的修改前后变化
- 检查配置文件是否被更改
- 生成补丁文件供他人使用(常用于开源项目)
- 配合 Git 进行版本对比
💡
diff并不是简单地“逐字节”对比,而是基于 最长公共子序列算法(LCS) 来找出最小的改动集合。
🛠 二、安装与查看版本
大多数 Linux 系统默认已安装 diffutils 包,包含 diff 工具。若未安装,可通过以下方式安装:
Ubuntu / Debian
sudo apt update
sudo apt install diffutils
CentOS / RHEL
sudo yum install diffutils
EulerOS / openEuler
sudo dnf install diffutils
查看版本:
diff --version
# 输出示例:diff (GNU diffutils) 3.8
📚 三、基本语法与常见参数
diff [OPTION]... FILES...
| 参数 | 含义说明 |
|---|---|
-b |
忽略空格变化(如多个空格视为一个) |
-B |
忽略空白行的变化 |
-i |
忽略大小写差异 |
-w |
忽略所有空白字符 |
-y |
并排显示两文件差异(适合人眼阅读) |
-s |
如果文件相同,输出信息提示 |
-u |
显示统一格式的上下文(适用于生成 patch 文件) |
-r |
递归比较目录下的所有文件 |
-N |
将缺失的文件视为空文件处理 |
-q |
只显示是否不同,不显示具体差异内容 |
🎯 四、实战场景与案例解析
✅ 场景1:比较两个文本文件的差异(基础用法)
diff file1.txt file2.txt
输出示例:
5c5
< Hello World!
---
> Hello, Linux!
解释:
5c5表示第5行发生更改(change)<表示来自第一个文件的内容---分隔符>表示第二个文件的新内容
✅ 场景2:使用 -u 生成标准格式的差异报告(推荐用于 Patch)
diff -u file1.txt file2.txt > changes.patch
输出示例:
--- file1.txt 2025-06-20 10:00:00.000000000 +0800
+++ file2.txt 2025-06-20 10:01:00.000000000 +0800
@@ -2,7 +2,7 @@
This is a test file.
Line 3
-Line 4
+Line four
Line 5
👀 此类输出可用于提交到 Git 或通过
patch命令打补丁。
✅ 场景3:递归比较两个目录下的所有文件(-r)
diff -r config_dir_old config_dir_new
输出示例:
Only in config_dir_new: new_config.conf
Files config_dir_old/app.conf and config_dir_new/app.conf differ
📁 常用于部署前检查配置文件是否更新,或对比两个项目的源码结构。
✅ 场景4:忽略空格和空白行(适用于格式化后的文件)
diff -wb file1.txt file2.txt
此命令会忽略所有空白字符和空行,适用于比较格式化后的内容(如 JSON、XML 文件)。
✅ 场景5:并列显示差异(-y),便于人工阅读
diff -y file1.txt file2.txt
输出示例:
Hello World! | Hello, Linux!
This line is the same = This line is the same
Line removed from file1 <
> New line added in file2
符号含义:
|表示该行内容不同<表示仅存在于第一个文件>表示仅存在于第二个文件=表示内容一致
✅ 场景6:批量比较文件夹并保存为日志
diff -r config_dir_old config_dir_new > diff_report.log
📝 此方法适用于自动化运维脚本中记录配置变更情况。
🧪 五、不同发行版之间的差异与注意事项
| 发行版 | 特点 |
|---|---|
| Ubuntu | 默认安装较新版本的 diff,支持现代文本编码格式(UTF-8) |
| CentOS 7/8 | 版本较低(如 diffutils-3.6),某些高级选项可能不支持 |
| EulerOS/openEuler | 企业级系统,通常集成稳定版本,适合服务器环境 |
| 注意 | 若需处理大文件或二进制文件,建议使用 cmp 或 xxd 工具辅助分析 |
🧰 六、进阶技巧与工具配合使用
🔗 配合 patch 使用(打补丁)
生成补丁:
diff -u old_file new_file > fix.patch
应用补丁:
patch < fix.patch
⚠️ 注意当前目录结构应与生成 patch 时一致,否则可能出现失败。
📄 配合 vimdiff 图形化查看差异
vimdiff file1 file2
🖥 在终端中打开 Vim 的分屏模式,左右两侧高亮显示差异内容,非常适合代码审查。
📂 配合 find 批量查找差异
find /etc -name "*.conf" -exec diff {} /backup/etc/{} \; | grep -v "are identical"
🔍 找出
/etc下与备份目录中不同的配置文件。
🧠 七、常见问题解答(FAQ)
| 问题 | 解答 |
|---|---|
diff 能否比较二进制文件? |
可以,但默认只提示“files differ”,要看到具体差异需使用 cmp 或 hexdump |
diff 是否可以比较远程文件? |
可先使用 scp 或 rsync 把文件拉到本地再比较 |
| 如何只显示不同的文件名而不显示具体内容? | 使用 diff -qr dir1 dir2 |
diff 和 git diff 有什么区别? |
git diff 更专注于版本控制中的差异,diff 更通用,适用于任意文件对比 |
📌 八、总结
diff 是 Linux 中最基础也最重要的文件对比工具之一。掌握它的使用不仅有助于理解文件内容的变化过程,还能帮助你高效地进行版本控制、配置管理、自动化测试等工作。
💡 提示:你可以将
diff结合cron定期检测重要配置文件是否被修改,并发送邮件通知。示例:
#!/bin/bash diff -qr /etc /backup/etc > /tmp/diff_result.txt if [ $? -ne 0 ]; then mail -s "Config files changed!" admin@example.com < /tmp/diff_result.txt fi
如有追加问题,请输入:追加问题:xxxx

浙公网安备 33010602011771号