diff命令用于比较两个文件的差异,掌握其语法、输出格式和常用选项可高效定位变化;1. 基础语法为diff 文件1 文件2,内容相同时无输出,不同时显示差异行;2. 默认输出中a表示添加、c表示修改、d表示删除,行号和符号说明如何从文件1变为文件2;3. 常用选项包括-u生成统一格式(显示上下文,+为新增,-为删除)、-i忽略大小写、-w忽略空白符、-b忽略空行、-r递归比较目录;4. 实用场景有检查配置变更、代码审查、生成补丁(结合patch命令)及脚本中判断文件是否相同;建议日常使用diff -u提升可读性,复杂情况可结合vimdiff或gui工具分析,从而完整掌握文件对比方法。
在 Linux 或类 Unix 系统中,
diff
命令是用于比较两个文件之间差异的常用工具。它能逐行分析文本文件,找出内容不同的地方,并以简洁的方式展示这些差异。掌握
diff
的基本用法和输出格式,有助于快速定位代码、配置文件或日志之间的变化。
一、diff 命令基础语法
diff 文件1 文件2
diff
会逐行对比两个文件,如果内容相同,则无输出;如果有差异,会显示具体哪些行被修改、添加或删除。
例如:
diff file1.txt file2.txt
如果
file1.txt
和
file2.txt
内容一致,终端不会显示任何内容;若有不同,将输出差异部分。
二、理解 diff 的输出格式
diff
默认使用“正常格式”(normal format),输出包含行号和操作符,说明如何从文件1变为文件2。
常见符号含义:
-
a
:add,表示在文件2中新增的行
-
c
:change,表示文件1中的行被修改为文件2中的行
-
d
:delete,表示文件1中的行在文件2中被删除
示例说明:
假设
file1.txt
内容为:
apple banana cherry
file2.txt
内容为:
apple grape cherry date
执行:
diff file1.txt file2.txt
输出:
2c2,3 < banana --- > grape > date
解释:
-
2c2,3
:文件1的第2行被修改,对应文件2的第2到第3行
-
< banana
:文件1中的内容
-
---
:分隔符
-
> grape
和
> date
:文件2中替换后的内容
这表示“banana”被替换为“grape”和“date”两行。
三、常用 diff 选项提升可读性
默认输出对新手不够友好,可通过选项改善:
1.
-u
-u
或
--unified
:生成统一格式输出(推荐)
diff -u file1.txt file2.txt
输出示例:
@@ -1,3 +1,3 @@ apple -banana +grape cherry +date
-
-
表示文件1有但文件2没有的行
-
+
表示文件2新增或修改的行
- 上下文默认显示3行,便于理解变更上下文
这种格式广泛用于代码版本控制(如 Git),更清晰易读。
2.
-i
-i
:忽略大小写差异
diff -i file1.txt file2.txt
将
Apple
和
Apple
视为相同。
3.
-w
-w
:忽略空白字符(空格、制表符)
diff -w file1.txt file2.txt
适合比较格式调整但内容一致的文件。
4.
-B
-B
:忽略空行差异
diff -B file1.txt file2.txt
防止因换行符或空行导致误报。
5.
-r
-r
:递归比较目录
diff -r dir1/ dir2/
逐个比较两个目录下所有同名文件。
四、实用技巧与场景
- 检查配置文件变更:系统升级前后对比
/etc
下的配置文件。
- 代码审查辅助:用
diff -u old.c new.c
快速生成补丁。
- 结合 patch 使用:
diff
输出可保存为补丁文件,用
patch
应用更改。
diff -u old.txt new.txt > patch.diff patch old.txt < patch.diff
- 脚本中判断文件是否相同:
if diff file1 file2 > /dev/null; then echo "文件相同" else echo "文件不同" fi
基本上就这些。
diff
虽然输出格式初看有点晦涩,但掌握关键符号和常用选项后,就能高效地进行文件对比。建议日常使用时搭配
-u
选项,提升可读性。对于图形化需求,也可结合
vimdiff
或 GUI 工具进一步分析。