Linux 命令:diff

概述

diff 命令是文本文件的详细差异对比工具 ,核心作用是逐行分析两个文件的内容差异,精准识别出新增行、删除行、修改行,并以标准化格式输出差异位置和具体内容。

资料合集:https://pan.quark.cn/s/6fe3007c3e95https://pan.quark.cn/s/561de99256a5https://pan.quark.cn/s/985f55b13d94https://pan.quark.cn/s/d0fb20abd19a

一、核心特点

  1. 无需提前排序 :与comm/join不同,diff对输入文件无排序要求,直接按原始行序对比;
  2. 支持多格式输出 :默认精简格式,还支持易读的上下文格式统一格式 (Git默认使用)、合并格式(便于补丁制作);
  3. 支持目录对比:可直接对比两个目录下的文件差异(识别新增/删除/修改的文件);
  4. 逐行精准分析:不仅能识别整行增删,还能识别行内的部分修改(部分格式下)。

二、基本语法

bash 复制代码
# 对比两个文件
diff [选项] 文件1 文件2

# 对比两个目录(递归对比所有子文件/子目录)
diff [选项] 目录1 目录2
  • 无选项时,默认输出精简格式的差异(以行号和符号标识增删改);
  • 支持 - 作为文件参数,代表读取标准输入(如 cat file1 | diff - file2)。

三、核心输出符号(精简格式,默认)

diff 精简格式通过行号范围操作符号标识差异,是最基础的输出格式,核心符号含义如下:

符号 含义 示例
a add,新增行(文件2相对文件1新增) 3a4 → 文件1第3行后,文件2新增了第4行
d delete,删除行(文件1相对文件2删除) 5d4 → 文件1第5行,在文件2中被删除(对应文件2第4行后)
c change,修改行(文件1的行与文件2的行内容不同) 2c2 → 文件1第2行与文件2第2行内容不一致
< 标识文件1的行内容(配合a/d/c使用)
> 标识文件2的行内容(配合a/d/c使用)

四、常用选项(按功能分类,高频必记)

diff 选项丰富,核心围绕输出格式、对比规则、目录对比 设计,重点掌握易读格式实用规则类选项即可覆盖90%场景:

🔹 输出格式(核心,推荐使用易读格式)
选项 作用 实用场景
-c 输出上下文格式 :显示差异行前后N行(默认3行)上下文,标注+/-/!标识差异 人工阅读,快速定位差异及周边内容
-u 输出统一格式 :合并上下文,用-表示删除、+表示新增,Git默认差异格式 最易读的格式,推荐日常使用
-e 输出编辑脚本格式 :可直接作为ed编辑器的脚本,将文件1修改为文件2 批量文件修改,制作简单补丁
-y 输出并排格式:左右两列分别显示文件1/文件2内容,直观对比 短行文本对比,一眼看出差异
-W N 配合-y使用,指定并排输出的总宽度(默认130字符) 适配窄终端,避免横向滚动
🔹 对比规则(忽略无关差异)
选项 作用 实用场景
-i 忽略大小写差异(如A和a、Hello和hello视为相同) 对比配置文件/代码,忽略大小写笔误
-b 忽略空格数量差异(如多个空格/制表符视为一个,行尾空格忽略) 对比代码,忽略缩进/空格的无意义修改
-B 忽略空行的增删差异 对比文本/日志,忽略空行的无关变更
-w 忽略所有空白字符(空格、制表符、换行符) 仅对比纯内容,忽略所有格式差异
🔹 目录对比(递归/精准)
选项 作用 实用场景
-r 递归对比子目录下的所有文件/子目录(目录对比默认不递归) 完整对比两个项目/配置目录的所有差异
-q 精简目录对比:仅显示「文件是否不同」,不输出具体差异内容 快速排查目录中哪些文件发生了修改
-s 显示两个文件完全相同的提示(默认不显示) 确认目录中哪些文件未发生任何变更

五、基础示例(文件对比,从简到易读)

先准备两个测试文件,模拟增删改三种差异:

txt 复制代码
# file1.txt(原始文件)
1. 苹果
2. 香蕉
3. 橙子
4. 葡萄
5. 芒果

# file2.txt(修改后文件)
1. 苹果
2. 香蕉
3. 柚子  # 修改:橙子→柚子
4. 葡萄
        # 新增:空行
5. 榴莲  # 修改:芒果→榴莲
6. 草莓  # 新增:最后一行
场景1:默认精简格式(快速看差异位置)
bash 复制代码
diff file1.txt file2.txt

输出结果(解读见注释):

复制代码
3c3                  # 文件1第3行 被修改为 文件2第3行
< 3. 橙子            # < 代表file1的内容
---                 # 分隔符
> 3. 柚子            # > 代表file2的内容
5a6,7               # 文件1第5行后,file2新增了第6、7行(空行+草莓)
> 
> 6. 草莓
5c6                  # 文件1第5行 被修改为 文件2第6行
< 5. 芒果
---
> 5. 榴莲
场景2:推荐!统一格式(-u,Git风格,最易读)
bash 复制代码
diff -u file1.txt file2.txt

输出结果(解读见注释):

复制代码
--- file1.txt  2026-02-02 10:00:00 # 源文件标识
+++ file2.txt  2026-02-02 10:05:00 # 目标文件标识
@@ -1,5 +1,7 @@  # 差异范围:file1第1-5行 → file2第1-7行
 1. 苹果
 2. 香蕉
-3. 橙子        # - 代表file1删除的行
+3. 柚子        # + 代表file2新增的行
 4. 葡萄
-5. 芒果        # - 代表file1删除的行
+               # + 代表file2新增的空行
+5. 榴莲        # + 代表file2新增的行
+6. 草莓        # + 代表file2新增的行

核心优势 :合并了差异行的上下文,用-/+直接标识增删,一眼看懂修改逻辑。

场景3:上下文格式(-c,显示差异周边内容)
bash 复制代码
diff -c file1.txt file2.txt

输出会标注!(修改行)、+(新增行)、-(删除行),并显示差异行前后3行默认上下文,适合需要参考周边内容的场景。

场景4:并排格式(-y,直观左右对比)
bash 复制代码
diff -y -W 40 file1.txt file2.txt  # -W 40 指定总宽度40

输出结果(|标识修改行,>标识新增行,<标识删除行):

复制代码
1. 苹果                1. 苹果
2. 香蕉                2. 香蕉
3. 橙子               |3. 柚子
4. 葡萄                4. 葡萄
5. 芒果               |5. 榴莲
                      > 
                      >6. 草莓

六、进阶示例(目录对比+实用组合)

场景1:递归对比两个目录(-r,核心)

对比dir1dir2的所有文件/子目录,识别新增、删除、修改的文件:

bash 复制代码
diff -r dir1 dir2

输出示例:

复制代码
# 标识文件内容不同
diff -r dir1/test.txt dir2/test.txt
1c1
< 原始内容
---
> 修改后内容

# 标识dir2新增文件
Only in dir2: newfile.txt

# 标识dir1删除文件(dir2无)
Only in dir1: oldfile.txt

# 标识子目录差异
diff -r dir1/subdir/file.csv dir2/subdir/file.csv
3a3
> 新增行
场景2:精简目录对比(-rq,仅看哪些文件不同)

只排查目录中发生变更/新增/删除的文件,不输出具体内容差异,快速定位变更文件:

bash 复制代码
diff -rq dir1 dir2

输出示例:

复制代码
Files dir1/test.txt and dir2/test.txt differ
Only in dir2: newfile.txt
Only in dir1: oldfile.txt
场景3:忽略空格/大小写对比代码/配置文件

对比代码时,缩进、空格、大小写的无意义变更会干扰判断,组合选项忽略无关差异:

bash 复制代码
# -i 忽略大小写 + -b 忽略空格数量 + -B 忽略空行
diff -u -ibB code1.py code2.py
场景4:制作补丁文件(-u + >,批量同步修改)

file1file2的修改制作成补丁文件.patch),可通过patch命令将其他相同的file1快速修改为file2,适合批量部署变更:

bash 复制代码
# 制作补丁:file1→file2的差异保存为file.patch
diff -u file1.txt file2.txt > file.patch

# 应用补丁:将file1.txt按补丁修改为file2.txt(-p0 表示补丁中的路径层级为0)
patch -p0 file1.txt < file.patch

核心价值:无需传输整个文件,仅传输小体积的补丁文件,即可同步修改,适合服务器配置变更、代码小版本更新。

场景5:对比标准输入与文件

将命令输出与现有文件对比,快速排查差异(如对比当前配置与默认配置):

bash 复制代码
# 生成当前系统时间配置,与默认配置文件对比
timedatectl show | diff -u /etc/chrony.conf -

七、与comm的核心区别(易混淆,必分清)

diffcomm均为文本对比工具,但设计目标和使用场景完全不同,无优劣之分,按需选择是关键:

命令 核心目标 输入要求 差异标识方式 核心适用场景
diff 分析内容的具体修改细节(增/删/改) 无需排序 行号+a/d/c-/+、` `等,精准到行内容
comm 判断行的归属关系(仅文件1/仅文件2/共有) 必须排序 三列输出,仅标识行的归属 快速找两个文件的交集(共有行)、差集(独有行)

通俗对比

  • 想知道「文件A改了哪几行、改了什么内容」→ 用diff
  • 想知道「文件A和文件B哪些行一样、哪些行只在其中一个文件里」→ 用comm

八、关键注意事项

  1. 二进制文件diff会直接提示「Binary files ... differ」,不输出具体差异,如需对比二进制文件需用专用工具(如cmp);
  2. 换行符兼容 :Windows文件的换行符是\r\n,Linux是\n,直接对比会出现无意义差异,需先用dos2unix转换Windows文件;
  3. 超大文件diff对超大文件(GB级)处理效率较低,若仅需判断是否相同,可用cmp命令(更快,逐字节对比,发现差异立即退出);
  4. 补丁文件路径 :制作补丁时,若文件带路径,应用补丁时需用-pN指定路径层级(N为忽略的路径层数,如patch -p1 < file.patch);
  5. 空文件对比 :空文件与非空文件对比,diff会标识为整行新增/删除。

九、高频组合用法(实战直接复用)

  1. 日常代码/配置对比(最推荐)diff -u -ibB 源文件 目标文件
  2. 快速定位目录变更文件diff -rq 目录1 目录2
  3. 制作补丁文件diff -u 源文件 目标文件 > 补丁.patch
  4. 应用补丁文件patch -p0 源文件 < 补丁.patch
  5. 直观左右对比短文本diff -y -W 60 源文件 目标文件
  6. 对比命令输出与文件命令 | diff -u 目标文件 -

总结

diffLinux文本差异分析的核心工具 ,核心价值是精准识别文件内容的增删改细节 ,并支持多种易读格式和补丁制作。日常使用的核心口诀

  • 人工阅读、制作补丁 → 用统一格式(-u),Git同款,最易读;
  • 快速定位目录变更文件 → 用diff -rq
  • 忽略无意义差异(空格/大小写/空行)→ 组合-ibB
  • 仅需行级归属(交集/差集)→ 用comm,而非diff
相关推荐
姚远Oracle ACE2 小时前
Step-by-Step: 在 Linux 上使用 VMware 安装 Oracle 26ai RAC 数据库
linux·数据库·oracle
进击切图仔2 小时前
基于 linux 20.04 构建 ros1 noetic 开发环境 -离线版本
linux·运维·服务器
starcat20022 小时前
ESXi安装直连显卡的KDE-NEON
linux
EmbedLinX2 小时前
Linux 之设备驱动
linux·服务器·c语言
vortex52 小时前
Alpine Linux syslinux 启动加固(密码保护)
linux·服务器·网络
晚风吹长发2 小时前
初步了解Linux中的线程同步问题及线程安全和死锁与生产消费者模型
linux·运维·服务器·开发语言·数据结构·安全
学嵌入式的小杨同学2 小时前
【Linux 封神之路】进程进阶实战:fork/vfork/exec 函数族 + 作业实现(含僵尸进程解决方案)
linux·开发语言·vscode·嵌入式硬件·vim·软件工程·ux
mi20062 小时前
银河麒麟上tabby和electerm两款终端工具比较
linux·运维
muyan92 小时前
统信uos-server-20-1070e-arm64-20250704-1310 安装mysql-5.7.44
linux·mysql·yum·rpm·uos·统信