0

0

如何在Linux中比较文件差异?使用diff命令分析两个文件的不同

蓮花仙者

蓮花仙者

发布时间:2025-08-28 09:14:01

|

669人浏览过

|

来源于php中文网

原创

答案:diff命令通过输出行号和操作符显示文件差异,使用-u选项可生成更易读的统一格式,-y选项实现并排对比,-r参数支持目录递归比较,而二进制文件应使用cmp命令处理。

如何在linux中比较文件差异?使用diff命令分析两个文件的不同

在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

这会把两个文件内容并排显示,中间用符号标记差异。

虎课网
虎课网

虎课网是超过1800万用户信赖的自学平台,拥有海量设计、绘画、摄影、办公软件、职业技能等优质的高清教程视频,用户可以根据行业和兴趣爱好,自主选择学习内容,每天免费学习一个...

下载
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
    退出。
  • 如果发生

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

392

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1350

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

704

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

776

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

573

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.07.20

Python GraphQL API 开发实战
Python GraphQL API 开发实战

本专题系统讲解 Python 在 GraphQL API 开发中的实际应用,涵盖 GraphQL 基础概念、Schema 设计、Query 与 Mutation 实现、权限控制、分页与性能优化,以及与现有 REST 服务和数据库的整合方式。通过完整示例,帮助学习者掌握 使用 Python 构建高扩展性、前后端协作友好的 GraphQL 接口服务,适用于中大型应用与复杂数据查询场景。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.5万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号