首页 > 系统教程 > LINUX > 正文

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

蓮花仙者
发布: 2025-08-28 09:14:01
原创
669人浏览过
<blockquote>答案:diff命令通过输出行号和操作符显示文件差异,使用-u选项可生成更易读的统一格式,-y选项实现并排对比,-r参数支持目录递归比较,而二进制文件应使用cmp命令处理。</blockquote> <p><img src="https://img.php.cn/upload/article/001/503/042/175634364444328.jpeg" alt="如何在linux中比较文件差异?使用diff命令分析两个文件的不同"></p> <p>在Linux中比较文件差异,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff</pre>
登录后复制
</div>命令是你的核心<a style="color:#f60; text-decoration:underline;" title="工具" href="https://www.php.cn/zt/16887.html" target="_blank">工具</a>。它能精准地指出两个文本文件之间,或者两个目录中同名文件之间的具体不同之处,是版本控制、代码审查和配置管理不可或缺的利器。</p> <p>要比较两个文件的差异,最基础的用法就是 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff 文件1 文件2</pre>
登录后复制
</div>。这命令一敲下去,它就会把两个文件哪里不一样,用一种它自己的语言告诉你。</p> <p>比如,我有两个文件,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file1.txt</pre>
登录后复制
</div> 和 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file2.txt</pre>
登录后复制
</div>:</p> <p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file1.txt</pre>
登录后复制
</div>:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>Hello world. This is line two. A third line here.</pre>
登录后复制
</div><p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file2.txt</pre>
登录后复制
</div>:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>Hello Linux. This is line two. A different third line. Fourth line added.</pre>
登录后复制
</div><p>我执行 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff file1.txt file2.txt</pre>
登录后复制
</div>,输出会是这样:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>1c1 < Hello world. --- > Hello Linux. 3c3,4 < A third line here. --- > A different third line. > Fourth line added.</pre>
登录后复制
</div><p>这输出一开始看可能有点蒙,但其实逻辑很简单:</p> <ul> <li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">1c1</pre>
登录后复制
</div> 表示 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file1.txt</pre>
登录后复制
</div> 的第1行和 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file2.txt</pre>
登录后复制
</div> 的第1行有“更改”(change)。</li> <li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"><</pre>
登录后复制
</div> 后面跟着的是 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file1.txt</pre>
登录后复制
</div> 中被修改或删除的内容。</li> <li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">></pre>
登录后复制
</div> 后面跟着的是 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file2.txt</pre>
登录后复制
</div> 中新增或修改后的内容。</li> <li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">---</pre>
登录后复制
</div> 是一个分隔符。</li> <li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">3c3,4</pre>
登录后复制
</div> 表示 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file1.txt</pre>
登录后复制
</div> 的第3行和 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file2.txt</pre>
登录后复制
</div> 的第3到第4行有更改。</li> </ul> <p>这个默认输出格式叫 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">ed</pre>
登录后复制
</div> 格式,对机器处理很友好,但人读起来嘛,就有点考验耐心了。</p> <h3>如何更直观地解读diff命令的输出结果?</h3> <p>说实话,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff</pre>
登录后复制
</div> 的默认输出,也就是 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">ed</pre>
登录后复制
</div> 格式,对于我们人类肉眼来说,确实不够友好。每次看到那堆 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">c</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">a</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">d</pre>
登录后复制
</div>,总得在脑子里转个弯。所以,我个人在日常使用中,几乎从不直接用默认格式,而是更偏爱那些能把差异展现得更清晰的选项。</p> <p>最常用的,也是我强烈推荐的,是统一(Unified)格式,通过 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">-u</pre>
登录后复制
</div> 选项来启用。它会把上下文也显示出来,让你清楚地知道差异发生在哪里。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:bash;toolbar:false;'>diff -u file1.txt file2.txt</pre>
登录后复制
</div><p>输出会变成这样:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:diff;toolbar:false;'>--- 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.</pre>
登录后复制
</div><p>看,这一下子就清晰多了!</p> <ul> <li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">---</pre>
登录后复制
</div> 和 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">+++</pre>
登录后复制
</div> 分别指示了原始文件和新文件。</li> <li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">@@ -1,3 +1,4 @@</pre>
登录后复制
</div> 这是一个“块头”,告诉你这个差异块在 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file1.txt</pre>
登录后复制
</div> 中是从第1行开始的3行,在 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file2.txt</pre>
登录后复制
</div> 中是从第1行开始的4行。</li> <li>以 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">-</pre>
登录后复制
</div> 开头的行表示只存在于 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file1.txt</pre>
登录后复制
</div> 而 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file2.txt</pre>
登录后复制
</div> 中没有的行(被删除或修改前的)。</li> <li>以 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">+</pre>
登录后复制
</div> 开头的行表示只存在于 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file2.txt</pre>
登录后复制
</div> 而 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file1.txt</pre>
登录后复制
</div> 中没有的行(被添加或修改后的)。</li> <li>没有前缀的行是两个文件都相同,作为上下文出现的行。</li> </ul> <p>除了 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">-u</pre>
登录后复制
</div>,还有一个非常直观的选项是 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">-y</pre>
登录后复制
</div>,它会以并排(Side-by-side)的方式显示两个文件。如果你终端够宽,或者想一眼看到两个文件的全貌,这个就很方便。通常还会结合 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">-W</pre>
登录后复制
</div> 来指定宽度。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:bash;toolbar:false;'>diff -y -W 80 file1.txt file2.txt</pre>
登录后复制
</div><p>这会把两个文件内容并排显示,中间用符号标记差异。</p> <div class="aritcle_card"> <a class="aritcle_card_img" href="/ai/1540"> <img src="https://img.php.cn/upload/ai_manual/000/969/633/68b7a213277e9355.png" alt="AI Surge Cloud"> </a> <div class="aritcle_card_info"> <a href="/ai/1540">AI Surge Cloud</a> <p>低代码数据分析平台,帮助企业快速交付深度数据</p> <div class=""> <img src="/static/images/card_xiazai.png" alt="AI Surge Cloud"> <span>87</span> </div> </div> <a href="/ai/1540" class="aritcle_card_btn"> <span>查看详情</span> <img src="/static/images/cardxiayige-3.png" alt="AI Surge Cloud"> </a> </div> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>Hello world. | Hello Linux. This is line two. This is line two. A third line here. | A different third line. > Fourth line added.</pre>
登录后复制
</div><p>这简直是为人类阅读量身定制的!左边是旧文件,右边是新文件。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">|</pre>
登录后复制
</div> 表示行有修改,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"><</pre>
登录后复制
</div> 表示左边独有,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">></pre>
登录后复制
</div> 表示右边独有。当然,如果文件内容很长,或者差异很细微,我可能还是会倾向于 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff -u</pre>
登录后复制
</div>,因为并排模式在处理大文件时,可能会让屏幕滚动得有点快,而且上下文的连贯性不如统一格式那么紧凑。所以,选择哪个模式,真的要看你具体想看什么,以及你的屏幕有多大。</p> <h3>如何利用diff命令比较目录和处理特殊文件类型?</h3> <p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff</pre>
登录后复制
</div> 命令的强大之处,可不仅仅局限于比较两个单独的文本文件。在日常工作中,我们经常需要对比两个目录,看看哪些文件被修改了,哪些是新增的,哪些又被删除了。这时候,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff -r</pre>
登录后复制
</div> (recursive,递归)就派上用场了。</p> <p>想象一下,你有一个项目目录 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">project_v1</pre>
登录后复制
</div> 和它的新版本 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">project_v2</pre>
登录后复制
</div>。你想知道这两个版本之间到底改了什么。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:bash;toolbar:false;'>diff -r project_v1 project_v2</pre>
登录后复制
</div><p>这个命令会递归地遍历两个目录,找出所有不同之处。它会报告:</p> <ul> <li>只存在于一个目录而另一个目录中没有的文件或子目录。</li> <li>两个目录中同名但内容不同的文件,并用标准的 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff</pre>
登录后复制
</div> 格式(通常是 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">ed</pre>
登录后复制
</div> 格式,但你也可以加上 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">-u</pre>
登录后复制
</div> 或 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">-y</pre>
登录后复制
</div>)显示文件内部的差异。</li> </ul> <p>例如,如果 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">project_v1/src/main.c</pre>
登录后复制
</div> 和 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">project_v2/src/main.c</pre>
登录后复制
</div> 内容不同,它就会像比较普通文件一样显示它们的差异。如果 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">project_v2</pre>
登录后复制
</div> 多了一个 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">README.md</pre>
登录后复制
</div>,它会显示 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">Only in project_v2: README.md</pre>
登录后复制
</div>。这对于快速概览两个代码库或配置集的变动情况非常有用。</p> <p>然而,当涉及到二进制文件时,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff</pre>
登录后复制
</div> 命令就有点力不从心了。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff</pre>
登录后复制
</div> 主要是为文本文件设计的,它尝试比较二进制文件时,通常只会告诉你 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">Binary files X and Y differ</pre>
登录后复制
</div>,或者干脆输出一堆乱码,因为二进制数据没有“行”的概念,也不是可读的字符。这种时候,我们通常会转向另一个专门的工具:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">cmp</pre>
登录后复制
</div>。</p> <p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">cmp</pre>
登录后复制
</div> 命令是“compare”的缩写,它专门用于比较两个文件的字节内容。它的输出非常简洁:如果文件相同,它什么都不输出;如果不同,它会告诉你第一个不同之处发生在哪个字节和哪一行(如果它能识别行的话)。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:bash;toolbar:false;'>cmp file1.bin file2.bin</pre>
登录后复制
</div><p>如果 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file1.bin</pre>
登录后复制
</div> 和 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file2.bin</pre>
登录后复制
</div> 不同,你可能会看到类似这样的输出: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">file1.bin file2.bin differ: byte 10, line 2</pre>
登录后复制
</div></p> <p>所以,我的经验是,对于目录和文本文件,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff -r</pre>
登录后复制
</div> 是主力;但一旦涉及图片、编译后的程序、压缩包等二进制文件,就果断切换到 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">cmp</pre>
登录后复制
</div>。这样分工明确,效率更高,也避免了 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff</pre>
登录后复制
</div> 在二进制文件上给出的误导性或无用信息。</p> <h3>提升效率:diff命令的高级应用与实践技巧</h3> <p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff</pre>
登录后复制
</div> 命令的基础用法固然重要,但在日常的开发、运维工作中,我们往往需要更深入、更灵活地使用它。我发现,真正能把 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff</pre>
登录后复制
</div> 用得出神入化的人,都是那些懂得将它融入自动化流程和与其他工具结合的人。</p> <p>一个非常实用的场景是<strong>生成补丁(patch)文件</strong>。当你修改了一个文件,想要把这些修改分享给别人,但又不想把整个文件发过去时,就可以用 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff -u</pre>
登录后复制
</div> 生成一个补丁文件。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:bash;toolbar:false;'>diff -u old_file.txt new_file.txt > my_changes.patch</pre>
登录后复制
</div><p>这个 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">my_changes.patch</pre>
登录后复制
</div> 文件就包含了从 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">old_file.txt</pre>
登录后复制
</div> 到 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">new_file.txt</pre>
登录后复制
</div> 的所有变动。接收方拿到这个补丁文件后,可以用 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">patch</pre>
登录后复制
</div> 命令轻松地将这些修改应用到他们的 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">old_file.txt</pre>
登录后复制
</div> 上:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:bash;toolbar:false;'>patch < my_changes.patch</pre>
登录后复制
</div><p>这在开源项目协作、分发小范围更新时特别方便,也比直接发送修改后的文件要高效得多,毕竟补丁文件通常小得多。</p> <p>另外,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff</pre>
登录后复制
</div> 的<strong>退出状态码</strong>在脚本中非常有用。</p> <ul> <li>如果文件完全相同,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">diff</pre>
登录后复制
</div> 会以 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">0</pre>
登录后复制
</div> 退出。</li> <li>如果文件有差异,它会以 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">1</pre>
登录后复制
</div> 退出。</li> <li>如果发生</li> </ul>

以上就是如何在Linux中比较文件差异?使用diff命令分析两个文件的不同的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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