一、基础语法与核心选项
1.1 基础语法
diff 命令的基本格式为:
Bashdiff [OPTION]... FILES
通过不同的选项组合,可以实现忽略大小写、生成补丁、彩色高亮等灵活功能。
1.2 常用选项速查表
| 选项 | 说明 |
|---|---|
-i | 忽略大小写差异 |
-u | 输出简洁的“上下文差异”(无冗余行) |
-c | 输出带上下文的差异(适合旧版补丁工具) |
-a/--text | 强制将文件视为文本比较(即使二进制文件) |
-b/--ignore-space-change | 忽略空格数量差异(如多个连续空格) |
-w/--ignore-all-space | 忽略所有空格差异(包括制表符) |
-e/--ed | 输出为ed编辑器可执行的脚本 |
-N/--new-file | 将缺失的文件视为“空文件”参与比较 |
-q/--brief | 仅输出“文件是否不同”,不显示具体差异 |
-s/--report-identical-files | 文件相同时明确提示“无差异” |
--version | 查看diff版本信息 |
--help | 查看帮助文档 |
二、输出格式全解析
diff 支持多种输出格式,适应不同场景需求。以下是最常用的4种模式:
2.1 正常模式(默认)
直接输出差异行,以 <(第一个文件内容)和 >(第二个文件内容)标记差异,结合 a(添加)、c(修改)、d(删除)操作符说明修改方式。
示例:比较 example1.txt 和 example2.txt
Bashdiff example1.txt example2.txt
输出结果:
1d0 < Apple 2a2,3 > Peach > Apple 4c5 < Watermelon --- > Melon
解释:
1d0:删除第一个文件的第1行(Apple)。2a2,3:在第一个文件的第2行后添加第二个文件的第2、3行(Peach、Apple)。4c5:将第一个文件的第4行(Watermelon)修改为第二个文件的第5行(Melon)。
2.2 上下文格式(-c)
输出差异时,会显示被修改行的前后3行上下文,并用 ***(第一个文件)、---(第二个文件)、*****(分隔符)标记区块。
示例:
Bashdiff -c example1.txt example2.txt
输出结果:
*** example1.txt 2024-07-12 12:37:32.501122111+0200 --- example2.txt 2024-07-12 12:53:30.526406291+0200 *************** *** 1,6 **** Apple Orange Banana - Watermelon Chery --- 1,7 ---- Orange Peach Apple Banana - Watermelon + Melon Chery
符号说明:
-:需从第一个文件删除的内容。+:需添加到第一个文件的内容。=:分隔符(实际输出中为---或***)。
2.3 统一格式(-u)
现代最常用的格式,由Git等工具广泛支持。输出更简洁,直接标注行范围(@@ -起始行,行数 +起始行,行数 @@),并用 -(删除)、+(添加)标记差异。
示例:
Bashdiff -u example1.txt example2.txt
输出结果:
--- example1.txt 2024-07-12 12:37:32.501122111+0200 +++ example2.txt 2024-07-12 12:53:30.526406291+0200 @@ -1,6 +1,7 @@ -Apple +Peach +Apple Orange Banana -Watermelon -Chery +Melon +Cherry
优势:直观显示“哪几行被修改”,适合脚本解析和补丁生成。
2.4 并排格式(-y)
左右并排显示两个文件内容,差异处用 |(内容不同)、<(仅左文件有)、>(仅右文件有)标记。
示例:
Bashdiff -y example1.txt example2.txt
输出结果:
Apple | Peach Orange Peach Banana Apple Watermelon Banana Chery Melon Cherry
优化:添加 --suppress-common-lines 可隐藏相同行,仅显示差异。
三、实战场景:从比较到补丁生成
3.1 简要比较(仅知是否不同)
若只需知道两个文件是否相同,用 -q 或 -s:
Bash# 仅输出“不同”或“相同” diff -q file1.txt file2.txt # 文件相同时明确提示 diff -s file1.txt file2.txt
3.2 递归比较目录
比较两个目录下的所有文件(含子目录),用 -r:
Bashdiff -r dir1/ dir2/
3.3 生成与应用补丁
开发中常用 diff 生成补丁文件(.patch),再用 patch 应用补丁。
生成补丁(基于原始文件和更新文件):
Bashdiff -u original.txt updated.txt > changes.patch
应用补丁(将 original.txt 按补丁修改为 updated.txt):
Bashpatch original.txt < changes.patch
3.4 彩色高亮差异
默认 diff 输出无颜色,安装 colordiff 可实现高亮:
Bash# 安装(Ubuntu/Debian) sudo apt install colordiff # 使用(效果更直观) colordiff file1.txt file2.txt
四、总结
diff 命令是Linux文本比较的核心工具,通过灵活组合选项,可满足从简单差异查看到大规模补丁生成的全场景需求。掌握其输出格式(正常、上下文、统一、并排)和常用选项(-u、-c、-r),能显著提升开发效率和问题排查速度。下次遇到文件差异问题,不妨试试这些技巧!
