前言:
diff命令是一个比较基本的文本文件内容比较工具,主要应用场景是新旧软件更新升级的时候,新旧配置文件的对比;部分语言开发的源码文件差异对比;生成补丁文件,快速同步两个不同的文件
vimdiff命令是一个更直观的文本内容比较工具,比diff命令更为直观,并且这两个命令都可以比较目录
当然,对于二进制文件,比如,有怀疑某个二进制文件被木马病毒等等改变了,如果你有一个确定是正确版本的文件,两者对比的时候,diff命令也会提示是否有差异,只是不显示具体有哪些差异了而已,因此,如果是二进制文件,并且想确切知道两者差异,应该是使用cmp命令了,本文对cmp命令就不做过多介绍了。
ok,下面就diff命令和vimdiff命令如何使用进行演示。
一、diff命令的两种输出形式
1、diff命令的一般输出
diff命令任何参数不加,就只会生成两个文件的差异报告,内容非常少,但不易阅读
例如,现在有这么两个文件,内容如下:
bash
[root@centos14 ~]# cat test
11
22
33
44
55
66
77
[root@centos14 ~]# cat test1
11
22
aa
33
44
55
bb
66
如果不加任何参数,diff 文件1 文件2 这样的对比,那么,输出如下:
bash
[root@centos14 ~]# diff test test1
3c3
<
---
> aa
7c7
<
---
> bb
9d8
< 77
这里的输出是test文件如何改变才能变成和test1文件一样,3c3表示test文件的第三行需要改变;7c7和3c3是一样的;9d8表示在test文件内删除第九行,内容为77;要把 test变成 test1,需要将 test第3行的空行换成 aa,将第7行的空行换成 bb,并删除第9行的 77
2、diff命令的并列显示
bash
[root@centos14 ~]# diff -bBwy -W 100 test test1
11 11
22 22
| aa
33 33
44 44
55 55
| bb
66 66
77 <
参数意义如下:
| 选 项 | 功 能 |
|---|---|
| -行数 | 指定要显示多少行的文本。此参数必须与 -c 或 -u 参数一并使用 |
| -a | diff 只会逐行比较文本文件 |
| -b | 不检查空格字符的不同 |
| -B | 不检查空白行 |
| -c | 显示全部内文,并标出不同之处 |
| -c 行数 | 与执行"-c-行数"指令相同 |
| -d | 使用不同的演算法,以较小的单位来做比较 |
| -D | 此参数的输出格式可用于前置处理器巨集 |
| -e | 此参数的输出格式可用于 ed 的 script 文件 |
| -f | 输出的格式类似 ed 的 script 文件,但按照原来文件的顺序来显示不同处 |
| -H | 比较大文件时,可加快速度 |
| -I | 若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异 |
| -i | 不检查大小写的不同 |
| -l | 将结果交由 pr 程序来分页 |
| -n | 将比较结果以 RCS 的格式来显示 |
| -N | 在比较目录时,若文件 A 仅出现在某个目录中,预设会显示:Only in目录:文件 A 若使用 -N 参 数,则 diff 会将文件 A 与一个空白的文件比较 |
| -p | 若比较的文件为 C 语言的程序码文件时,显示差异所在的函数名称 |
| -P | 与 -N 类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空 白的文件做比较 |
| -q | 仅显示有无差异,不显示详细的信息 |
| -r | 比较子目录中的文件 |
| -s | 若没有发现任何差异,仍然显示信息 |
| -S | 从指定的文件开始比较目录 |
| -t | 在输出时,将 tab 字符展开 |
| -T | 在每行前面加上 tab 字符以便对齐 |
| -u | 以合并的方式来显示文件内容的不同 |
| -v | 显示版本信息 |
| -w | 忽略全部的空格字符 |
| -W | 在使用 -y 参数时,指定栏宽 |
| -x | 不比较选项中所指定的文件或目录 |
| -X | 可以将文件或目录类型存成文本文件,然后在?中指定此文本文件 |
| -y | 以并列的方式显示文件的异同之处 |
| --help | 显示帮助 |
| --left-column | 在使用 -y 参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容 |
这种并列对比方式是最为直观的一种方式。简单说,就是标记有< > | 这样的行是两个文件差异的地方,记录的是左边文件如何变化成右边的文件
第二种并列是patch补丁形式,还是以上面两个文件为示例,diff命令只使用-u参数,如果重定向,输出的文件就是补丁文件:
bash
[root@centos14 ~]# diff -u test test1
--- test 2026-01-02 16:13:17.338792178 +0800
+++ test1 2026-01-02 12:34:24.484798326 +0800
@@ -1,9 +1,8 @@
11
22
-
+aa
33
44
55
-
+bb
66
-77
如果是以补丁文件的形式,批量修改文本文件,那么,需要使用-U参数,-U后接上下文行数,-u参数是默认的5行上下文,例如以用户文件为例:
bash
[root@centos14 ~]# diff -ybBw -W 100 /etc/passwd passwd
root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
> sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologi mail:x:8:12:mail:/var/spool/mail:/sbin/nologi
operator:x:11:0:operator:/root:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Man systemd-network:x:192:192:systemd Network Man
dbus:x:81:81:System message bus:/:/sbin/nolog dbus:x:81:81:System message bus:/:/sbin/nolog
polkitd:x:999:998:User for polkitd:/:/sbin/no polkitd:x:999:998:User for polkitd:/:/sbin/no
sshd:x:74:74:Privilege-separated SSH:/var/emp sshd:x:74:74:Privilege-separated SSH:/var/emp
postfix:x:89:89::/var/spool/postfix:/sbin/nol postfix:x:89:89::/var/spool/postfix:/sbin/nol
| ntp:x:38:38::/etc/ntp:/sbin/nologin
<
[root@centos14 ~]# diff -U3 /etc/passwd passwd
--- /etc/passwd 2026-01-02 13:01:21.241256072 +0800
+++ passwd 2026-01-02 18:20:58.335538341 +0800
@@ -3,6 +3,7 @@
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
+sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
@@ -15,5 +16,4 @@
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
-
-
+ntp:x:38:38::/etc/ntp:/sbin/nologin
以上是说右边的passwd文件比/etc/passwd 文件多sync和ntp两行,上下文是三行
二、补丁patch和diff命令结合应用的场景
还是以上面test和test1这两个文本文件为例,首先,利用diff命令生成补丁文件,然后,通过补丁文件将test文件修改为test1文件的内容:
bash
[root@centos14 ~]# cat test
11
22
33
44
55
66
77
[root@centos14 ~]# cat test1
11
22
aa
33
44
55
bb
66
[root@centos14 ~]# diff -u test test1>twofile.patch
[root@centos14 ~]# patch test <twofile.patch
patching file test
[root@centos14 ~]# cat test
11
22
aa
33
44
55
bb
66
替换完毕后,只要补丁文件还在,就可以随时恢复 patch -R 就可以恢复原来的test文件:
bash
[root@centos14 ~]# patch -R test <twofile.patch
patching file test
[root@centos14 ~]# cat test
11
22
33
44
55
66
77
三、
diff命令结合patch命令的应用场景
一般应用场景是操作系统的迭代更新和配置文件的批量全自动更新
无论是代码版本的迭代,系统配置的批量更新,还是安全漏洞的紧急修复,补丁文件都提供了一种轻量级、高可用的解决方案。掌握补丁技术,是进阶开发者和系统管理员的必备技能。
一般最常用的形式是
- diff -urN software-1.0 software-1.0-debian > debian/patches/01-custom-fix.patch (u是标准输出,r是递归,N选项将不存在的文件视为空文件进行比较,确保如果 new_dir中有全新文件,补丁文件会包含创建该文件所需的全部内容,反之亦然。这使得补丁功能更完整。)
- patch -p0 -b /etc/ssh/sshd_config < disable_password_auth.patch (-p0命令会直接寻找绝对路径;-p1命令会直接寻找相对路径;应用补丁文件前先备份,备份名称为原文件名.orig)
四、
vimdiff的简单使用
vimdiff是一个比diff -y 更为直观的命令,例如:

启动后,窗口会垂直分割,每个文件在一个窗格中打开。不同的行会高亮显示,通常:
-
白色背景:相同的内容。
-
深色背景(如蓝色/绿色):有差异的行。
-
红色背景:冲突或特别需要关注的行。
另外多说一句,vimdiff也可以当成vim使用,也就是vimdiff和vim是基本一样的,vimdiff 切换窗口是CTRL+w ,hjkl