Linux下diff命令使用教程
珍惜时间,勤奋学习!今天给大家带来《Linux下如何用diff比较文件差异》,正文内容主要涉及到等等,如果你正在学习文章,或者是对文章有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!
答案:diff命令通过输出行号和操作符显示文件差异,使用-u选项可生成更易读的统一格式,-y选项实现并排对比,-r参数支持目录递归比较,而二进制文件应使用cmp命令处理。
在Linux中比较文件差异,diff
命令是你的核心工具。它能精准地指出两个文本文件之间,或者两个目录中同名文件之间的具体不同之处,是版本控制、代码审查和配置管理不可或缺的利器。
要比较两个文件的差异,最基础的用法就是 diff 文件1 文件2
。这命令一敲下去,它就会把两个文件哪里不一样,用一种它自己的语言告诉你。
比如,我有两个文件,file1.txt
和 file2.txt
:
file1.txt
:
Hello world. This is line two. A third line here.
file2.txt
:
Hello Linux. This is line two. A different third line. Fourth line added.
我执行 diff file1.txt file2.txt
,输出会是这样:
1c1 < Hello world. --- > Hello Linux. 3c3,4 < A third line here. --- > A different third line. > Fourth line added.
这输出一开始看可能有点蒙,但其实逻辑很简单:
1c1
表示file1.txt
的第1行和file2.txt
的第1行有“更改”(change)。<
后面跟着的是file1.txt
中被修改或删除的内容。>
后面跟着的是file2.txt
中新增或修改后的内容。---
是一个分隔符。3c3,4
表示file1.txt
的第3行和file2.txt
的第3到第4行有更改。
这个默认输出格式叫 ed
格式,对机器处理很友好,但人读起来嘛,就有点考验耐心了。
如何更直观地解读diff命令的输出结果?
说实话,diff
的默认输出,也就是 ed
格式,对于我们人类肉眼来说,确实不够友好。每次看到那堆 c
、a
、d
,总得在脑子里转个弯。所以,我个人在日常使用中,几乎从不直接用默认格式,而是更偏爱那些能把差异展现得更清晰的选项。
最常用的,也是我强烈推荐的,是统一(Unified)格式,通过 -u
选项来启用。它会把上下文也显示出来,让你清楚地知道差异发生在哪里。
diff -u file1.txt file2.txt
输出会变成这样:
--- file1.txt 2023-10-27 10:00:00.000000000 +0800 +++ file2.txt 2023-10-27 10:01:00.000000000 +0800 @@ -1,3 +1,4 @@ -Hello world. +Hello Linux. This is line two. -A third line here. +A different third line. +Fourth line added.
看,这一下子就清晰多了!
---
和+++
分别指示了原始文件和新文件。@@ -1,3 +1,4 @@
这是一个“块头”,告诉你这个差异块在file1.txt
中是从第1行开始的3行,在file2.txt
中是从第1行开始的4行。- 以
-
开头的行表示只存在于file1.txt
而file2.txt
中没有的行(被删除或修改前的)。 - 以
+
开头的行表示只存在于file2.txt
而file1.txt
中没有的行(被添加或修改后的)。 - 没有前缀的行是两个文件都相同,作为上下文出现的行。
除了 -u
,还有一个非常直观的选项是 -y
,它会以并排(Side-by-side)的方式显示两个文件。如果你终端够宽,或者想一眼看到两个文件的全貌,这个就很方便。通常还会结合 -W
来指定宽度。
diff -y -W 80 file1.txt file2.txt
这会把两个文件内容并排显示,中间用符号标记差异。
Hello world. | Hello Linux. This is line two. This is line two. A third line here. | A different third line. > Fourth line added.
这简直是为人类阅读量身定制的!左边是旧文件,右边是新文件。|
表示行有修改,<
表示左边独有,>
表示右边独有。当然,如果文件内容很长,或者差异很细微,我可能还是会倾向于 diff -u
,因为并排模式在处理大文件时,可能会让屏幕滚动得有点快,而且上下文的连贯性不如统一格式那么紧凑。所以,选择哪个模式,真的要看你具体想看什么,以及你的屏幕有多大。
如何利用diff命令比较目录和处理特殊文件类型?
diff
命令的强大之处,可不仅仅局限于比较两个单独的文本文件。在日常工作中,我们经常需要对比两个目录,看看哪些文件被修改了,哪些是新增的,哪些又被删除了。这时候,diff -r
(recursive,递归)就派上用场了。
想象一下,你有一个项目目录 project_v1
和它的新版本 project_v2
。你想知道这两个版本之间到底改了什么。
diff -r project_v1 project_v2
这个命令会递归地遍历两个目录,找出所有不同之处。它会报告:
- 只存在于一个目录而另一个目录中没有的文件或子目录。
- 两个目录中同名但内容不同的文件,并用标准的
diff
格式(通常是ed
格式,但你也可以加上-u
或-y
)显示文件内部的差异。
例如,如果 project_v1/src/main.c
和 project_v2/src/main.c
内容不同,它就会像比较普通文件一样显示它们的差异。如果 project_v2
多了一个 README.md
,它会显示 Only in project_v2: README.md
。这对于快速概览两个代码库或配置集的变动情况非常有用。
然而,当涉及到二进制文件时,diff
命令就有点力不从心了。diff
主要是为文本文件设计的,它尝试比较二进制文件时,通常只会告诉你 Binary files X and Y differ
,或者干脆输出一堆乱码,因为二进制数据没有“行”的概念,也不是可读的字符。这种时候,我们通常会转向另一个专门的工具:cmp
。
cmp
命令是“compare”的缩写,它专门用于比较两个文件的字节内容。它的输出非常简洁:如果文件相同,它什么都不输出;如果不同,它会告诉你第一个不同之处发生在哪个字节和哪一行(如果它能识别行的话)。
cmp file1.bin file2.bin
如果 file1.bin
和 file2.bin
不同,你可能会看到类似这样的输出:
file1.bin file2.bin differ: byte 10, line 2
所以,我的经验是,对于目录和文本文件,diff -r
是主力;但一旦涉及图片、编译后的程序、压缩包等二进制文件,就果断切换到 cmp
。这样分工明确,效率更高,也避免了 diff
在二进制文件上给出的误导性或无用信息。
提升效率:diff命令的高级应用与实践技巧
diff
命令的基础用法固然重要,但在日常的开发、运维工作中,我们往往需要更深入、更灵活地使用它。我发现,真正能把 diff
用得出神入化的人,都是那些懂得将它融入自动化流程和与其他工具结合的人。
一个非常实用的场景是生成补丁(patch)文件。当你修改了一个文件,想要把这些修改分享给别人,但又不想把整个文件发过去时,就可以用 diff -u
生成一个补丁文件。
diff -u old_file.txt new_file.txt > my_changes.patch
这个 my_changes.patch
文件就包含了从 old_file.txt
到 new_file.txt
的所有变动。接收方拿到这个补丁文件后,可以用 patch
命令轻松地将这些修改应用到他们的 old_file.txt
上:
patch < my_changes.patch
这在开源项目协作、分发小范围更新时特别方便,也比直接发送修改后的文件要高效得多,毕竟补丁文件通常小得多。
另外,diff
的退出状态码在脚本中非常有用。
- 如果文件完全相同,
diff
会以0
退出。 - 如果文件有差异,它会以
1
退出。 - 如果发生
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

- 上一篇
- 包子漫画免费阅读官网入口

- 下一篇
- 响应式导航菜单:JS与CSS实现汉堡菜单
-
- 文章 · linux | 14分钟前 | 内存监控 free命令 Linux内存 available内存 buff/cache
- Linux内存查看方法:free命令使用教程
- 253浏览 收藏
-
- 文章 · linux | 1小时前 |
- Linux自动化运维:脚本与Ansible实战教程
- 400浏览 收藏
-
- 文章 · linux | 1小时前 |
- Linux日志轮转配置教程
- 283浏览 收藏
-
- 文章 · linux | 1小时前 |
- Linux防DoS攻击:防火墙与限速设置技巧
- 131浏览 收藏
-
- 文章 · linux | 2小时前 | Linux linux常用命令
- Linux终端清屏技巧:clear命令使用教程
- 104浏览 收藏
-
- 文章 · linux | 2小时前 |
- LinuxCPU内存监控:top与vmstat使用教程
- 148浏览 收藏
-
- 文章 · linux | 3小时前 | Linux linux常用命令
- Linux快速切换目录技巧:cd命令详解
- 448浏览 收藏
-
- 文章 · linux | 3小时前 |
- Linux数据库优化:配置调整提升性能
- 292浏览 收藏
-
- 文章 · linux | 4小时前 | Linux
- Linux紧急关机命令及强制关机步骤详解
- 106浏览 收藏
-
- 文章 · linux | 4小时前 |
- LinuxSSH优化技巧分享
- 295浏览 收藏
-
- 文章 · linux | 4小时前 |
- Linux防暴力破解方法详解
- 262浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 372次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 370次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 360次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 373次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 389次使用
-
- 命令行工具:应对Linux服务器安全挑战的利器
- 2023-10-04 501浏览
-
- 如何使用Docker进行容器的水平伸缩和负载均衡
- 2023-11-07 501浏览
-
- linux .profile的作用是什么
- 2024-04-07 501浏览
-
- 如何解决s权限位引发postfix及crontab异常
- 2024-11-21 501浏览
-
- 如何通过脚本自动化Linux上的K8S安装
- 2025-02-17 501浏览