news 2026/4/4 21:50:49

Linux 命令:diff

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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. 逐行精准分析:不仅能识别整行增删,还能识别行内的部分修改(部分格式下)。

二、基本语法

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

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

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

符号含义示例
aadd,新增行(文件2相对文件1新增)3a4→ 文件1第3行后,文件2新增了第4行
ddelete,删除行(文件1相对文件2删除)5d4→ 文件1第5行,在文件2中被删除(对应文件2第4行后)
cchange,修改行(文件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显示两个文件完全相同的提示(默认不显示)确认目录中哪些文件未发生任何变更

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

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

# file1.txt(原始文件) 1. 苹果 2. 香蕉 3. 橙子 4. 葡萄 5. 芒果 # file2.txt(修改后文件) 1. 苹果 2. 香蕉 3. 柚子 # 修改:橙子→柚子 4. 葡萄 # 新增:空行 5. 榴莲 # 修改:芒果→榴莲 6. 草莓 # 新增:最后一行
场景1:默认精简格式(快速看差异位置)
difffile1.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风格,最易读)
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,显示差异周边内容)
diff-c file1.txt file2.txt

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

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

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

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

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

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

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

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,仅看哪些文件不同)

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

diff-rq dir1 dir2

输出示例:

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

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

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

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

# 制作补丁:file1→file2的差异保存为file.patchdiff-u file1.txt file2.txt>file.patch# 应用补丁:将file1.txt按补丁修改为file2.txt(-p0 表示补丁中的路径层级为0)patch -p0 file1.txt<file.patch

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

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

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

# 生成当前系统时间配置,与默认配置文件对比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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 20:28:54

2026年AI开发平台的终极竞争——生态与开发者心智

当技术功能逐渐同质化&#xff0c;2026年AI开发平台的竞争将上升到生态与开发者体验的维度。谁能为开发者创造最大价值&#xff0c;谁能构建最繁荣的应用生态&#xff0c;谁就将赢得未来。这对企业意味着&#xff0c;在思考AI开发平台怎么选时&#xff0c;必须评估其“生态健康…

作者头像 李华
网站建设 2026/4/3 4:49:52

让“入职背调”成为您人才决策的坚实基石

在竞争激烈的人才市场&#xff0c;一次误聘不仅带来高昂成本&#xff0c;更可能影响团队稳定与企业声誉。传统的背景调查方式耗时长、信息零散、核实困难&#xff0c;让招聘工作充满不确定性。 江湖背调&#xff0c;为您提供高效、可靠、合规的一站式解决方案。系统深度对接权威…

作者头像 李华
网站建设 2026/3/31 11:39:42

MDN全面接入Deno兼容性数据:现代Web开发的“一张图”方案

从“双轨”到“一图”&#xff1a;Deno兼容性数据正式落地MDN Deno官方博客的一则简短公告&#xff0c;却让前端开发者群体瞬间沸腾——Deno的兼容性数据现在与MDN Web API图表同框显示。这意味着&#xff0c;过去需要分别查看Node.js、Chrome、Firefox以及Deno四条兼容曲线的…

作者头像 李华
网站建设 2026/3/28 2:48:55

WordPress 在哪里存储网站上的图片?

作为 WordPress 用户&#xff0c;你是否想过图片文件到底存储在哪里&#xff1f;或者如何更高效地管理这些图片文件&#xff1f;在这篇文章中&#xff0c;我们将详细讲解 WordPress 是如何存储图片的&#xff0c;如何修改图片存储方式&#xff0c;以及如何整理和让用户上传图片…

作者头像 李华
网站建设 2026/3/31 19:14:51

科技润田 智赋农耕,以数字力量激活农业新质生产力

智慧农业示范基地展现了现代农耕的全新面貌&#xff0c;田间部署的智能设备描绘出技术与农业融合的生动场景。烟台中盾信息科技有限公司专注于数字农业领域&#xff0c;以物联网、大数据和人工智能为核心技术&#xff0c;提供精准监测与智能调控解决方案&#xff0c;从而改变传…

作者头像 李华