在日常的Ubuntu使用中,我们经常会遇到需要确认两个文件是否一致的情况:比如修改配置文件前先备份一份,改完之后想看看自己到底动了哪些行;或者从服务器上拉下来一份脚本,想和本地版本对比一下有哪些不同。靠肉眼逐行去核对不仅效率低,而且稍有疏忽就会漏掉关键改动。Linux自带的diff命令正是为这个场景设计的,它可以逐行扫描文件内容,精确标出增删改的位置。本文将从基础语法讲起,逐步深入到常用参数、输出格式以及与图形化工具的配合使用。

diff命令的基础语法与标准输出解读
diff是Ubuntu默认安装的工具,属于diffutils软件包的一部分,无需额外安装即可使用。它的最基本形式是diff 文件1 文件2,执行后会把两个文件的差异逐行输出到终端。理解输出结果的格式是用好diff的第一步,因为它的标记方式有一定的约定规则。
来看一个简单的例子。假设有两个文本文件a.txt和b.txt,内容分别只有几行,执行对比后会得到类似下面的输出:
# 文件 a.txt apple banana cherry date # 文件 b.txt apple blueberry cherry # 执行比较 diff a.txt b.txt
diff的标准输出(也叫正常格式)使用a、c、d三个字母来表达操作类型:a表示add(添加),即第一个文件需要增加某些行才能变成第二个文件;c表示change(修改),某些行需要被替换;d表示delete(删除),某些行需要被删掉。输出中<符号开头的行属于第一个文件,>符号开头的行属于第二个文件,中间用一排短横线分隔。按照这个规则读输出,就能快速还原出两份文件的全部差异。
需要注意的是,diff默认没有差异时不会输出任何内容,直接返回命令提示符。这一点在写脚本时反而很实用,后面会结合返回值专门说明。
三种输出格式与上下文参数详解
标准格式虽然信息完整,但读起来不够直观,尤其是文件较长时很难定位差异所在的上下文。diff提供了另外两种更常用的输出格式:上下文格式和统一格式。其中统一格式是我们最常见的,因为git、patch等工具都采用这种格式。
使用-c参数得到上下文格式,它会显示差异行前后各三行的内容,并用!标记被修改的行、+和-分别表示第二个文件新增或删除的行。使用-u参数得到统一格式,输出类似@@ -1,4 +1,4 @@的行号范围标记,然后以-开头表示被删除的行、+开头表示新增的行,一眼就能看出改动内容:
# 统一格式输出示例 diff -u a.txt b.txt --- a.txt +++ b.txt @@ -1,4 +1,3 @@ apple -banana +blueberry cherry -date
除了格式参数,还有几个高频使用的控制参数值得掌握。-i忽略大小写差异,-w忽略所有空白字符差异(包括空格和制表符),-B忽略空行的变化。这几个参数在对比配置文件时特别有用,因为很多时候缩进方式不同但语义完全一致,不加参数会产生大量噪音输出。如果希望并排显示两个文件方便肉眼对比,可以加上-y参数,效果类似于图形化对比工具的双栏视图,再配合--width指定终端宽度即可。
对于目录级别的比较,diff同样支持。直接diff 目录1 目录2会比较两个目录下同名文件的差异,加上-r参数后还会递归进入子目录,逐一对比所有文件。输出中会标明只在其中一个目录存在的文件(Only in ...),这对于核对两台机器的配置目录是否一致非常方便。
结合返回值做自动化判断与工具配合
diff的返回值(exit status)是一个容易被忽视但很实用的特性。它有三个取值:0表示两个文件完全相同,1表示存在差异,2表示发生了错误(比如文件不存在)。利用这个特性,可以在Shell脚本中做条件判断:
#!/bin/bash
# 对比备份配置与当前配置
if diff -q /etc/nginx/nginx.conf /backup/nginx.conf.bak >/dev/null; then
echo "配置文件与备份一致,无需处理"
else
echo "配置文件已发生变化,请检查以下差异:"
diff -u /backup/nginx.conf.bak /etc/nginx/nginx.conf
fi
上面脚本中用到的-q参数表示安静模式,只报告文件是否不同,不输出具体差异,非常适合只关心结果是否一致的场合。与之类似的还有-s参数,在文件相同时也会输出一句提示,两种参数按需选用即可。
diff的输出还可以作为patch命令的输入,实现差异补丁的生成与应用。典型流程是diff -u old.txt new.txt > my.patch生成补丁,然后在另一台机器上patch old.txt < my.patch就能把旧文件更新为新版本,这是很多运维场景下同步配置改动的经典做法。
最后介绍两个提升使用体验的辅助工具。一是colordiff,它是diff的封装,用不同颜色高亮差异行,通过sudo apt install colordiff安装后直接替换diff命令使用即可。二是vimdiff(或vim -d),它能以多窗口方式并排打开多个文件,差异行带底色高亮,还支持直接在窗口间同步滚动和复制内容,适合需要逐处确认并手工合并的场景。把命令行的diff用于快速判断,把vimdiff用于精细比对,两者搭配基本能覆盖绝大多数文件对比需求。
Ubuntu diff命令文件差异比较Linux文本对比修改时间:2026-09-07 01:24:32