Linux diff 命令使用详解

发布于 阅读 74未分类

一、基础语法与核心选项

1.1 基础语法

diff 命令的基本格式为:

Bash
diff [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.txtexample2.txt

Bash
diff example1.txt example2.txt

输出结果:

1d0
< Apple
2a2,3
> Peach
> Apple
4c5
< Watermelon
---
> Melon

解释

  • 1d0:删除第一个文件的第1行(Apple)。
  • 2a2,3:在第一个文件的第2行后添加第二个文件的第2、3行(PeachApple)。
  • 4c5:将第一个文件的第4行(Watermelon)修改为第二个文件的第5行(Melon)。

2.2 上下文格式(-c

输出差异时,会显示被修改行的前后3行上下文,并用 ***(第一个文件)、---(第二个文件)、*****(分隔符)标记区块。

示例

Bash
diff -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等工具广泛支持。输出更简洁,直接标注行范围@@ -起始行,行数 +起始行,行数 @@),并用 -(删除)、+(添加)标记差异。

示例

Bash
diff -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

左右并排显示两个文件内容,差异处用 |(内容不同)、<(仅左文件有)、>(仅右文件有)标记。

示例

Bash
diff -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

Bash
diff -r dir1/ dir2/

3.3 生成与应用补丁

开发中常用 diff 生成补丁文件(.patch),再用 patch 应用补丁。

生成补丁(基于原始文件和更新文件):

Bash
diff -u original.txt updated.txt > changes.patch

应用补丁(将 original.txt 按补丁修改为 updated.txt):

Bash
patch 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),能显著提升开发效率和问题排查速度。下次遇到文件差异问题,不妨试试这些技巧!

评论 (0)
0 / 500
暂无评论,快来抢沙发~