Linux diff命令教程:彻底搞懂如何找出文件之间的差异(附实例详解和注意事项)
2024-04-12 16:32:37
ThanksView
  • 访问次数: 222
  • 注册日期: 2019-03-19
  • 最后登录: 2024-04-22
Linux diff命令介绍
diff 命令,即 differences,主要用于比较两个文件或者两个文件夹中文件的差异。在日常开发或者文档生成中,我们常常会同时维护着多个版本的文件,diff 命令就能用来帮助我们分析出不同版本之间的区别。diff 命令会逐行比较并在被比较的两个文件中寻找差异,如果文件相同,就不会有任何输出。

Linux diff命令适用的Linux版本
这个命令在大部分的 Linux 发行版, 包括 Ubuntu, Debian, Fedora 和 CentOS 等都可以直接使用. 对于没有预装 diff 命令的发行版,可以通过包管理器进行安装:

对于基于 Debian 的系统(如 Ubuntu),可以使用如下命令安装:

[linux@bashcommandnotfound.cn ~]$ sudo apt-get install diffutils
1
对于基于 Red Hat 的系统 (如 CentOS),CentOS7 版本可以使用以下命令安装:

[linux@bashcommandnotfound.cn ~]$ sudo yum install diffutils

而 CentOS8 可以使用以下命令安装:

[linux@bashcommandnotfound.cn ~]$ sudo dnf install diffutils

Linux diff命令的基本语法
diff 命令的基本语法格式如下:

diff [options] file1 file2

Linux diff命令的常用选项或参数说明
选项 描述
-i 忽略大小写差异
-w 忽略所有空格
-B 忽略空白行
-y 并排比较文件
-n 使用RCS格式进行比较
-c 以C语言风格进行比较
Linux diff命令实例详解
实例1:比较两个文本文件
[linux@bashcommandnotfound.cn ~]$ diff file1.txt file2.txt

这个简单的示例会比较两个文本文件,向我们显示两者之间的差异。

实例2:使用-c选项进行比较
[linux@bashcommandnotfound.cn ~]$ diff -c file1 file2

使用 -c 选项,我们可以在比较两个文件时显示“上下文”,即显示差异前后的几行代码,这样能更清晰地看到差异的具体位置。

实例3:使用 -i 选项忽略大小写进行比较
[linux@bashcommandnotfound.cn ~]$ diff -i file1 file2

在某些情况下,可能我们只关注内容差异,而不关注大小写差异,这时就可以使用 -i 选项。

实例4:使用 -w 选项忽略行内空格的差异
行内空格的差异有时候是我们并不关心的,这时可以使用 -w 选项来忽略它。

[linux@bashcommandnotfound.cn ~]$ diff -w file1 file2

实例5:使用 -B 选项来忽略空白行
有时候,在一个文件中的空白行会使得比较的结果显得混乱,我们可以通过 -B 选项来忽略这些变化。

[linux@bashcommandnotfound.cn ~]$ diff -B file1 file2

实例6:使用 -y 选项并排比较文件
有时我们不仅想知道两个文件的差异,还希望能同时看到两个文件的内容,这时候可以使用 -y 选项。

[linux@bashcommandnotfound.cn ~]$ diff -y file1 file2

实例7:使用-n选项以RCS格式输出差异
RCS (Revision Control System) 是一种老旧的版本控制系统,我们可以使用它的格式来输出 diff 的结果。

[linux@bashcommandnotfound.cn ~]$ diff -n file1 file2

这样的输出更便于检视或者做进一步处理。

实例8:比较目录
除了文件,diff 也可以用来比较目录。下面的命令将比较两个目录下的文件。

[linux@bashcommandnotfound.cn ~]$ diff directory1 directory2

实例9:使用-r选项递归比较目录
如果想要比较两个目录以及它们的子目录下的所有文件,我们可以使用 -r 选项。

[linux@bashcommandnotfound.cn ~]$ diff -r directory1 directory2

实例10:使用-u选项进行统一格式比较
如果你喜欢 Git 中 diff 的输出格式,你可以使用 -u 选项来得到类似的输出。

[linux@bashcommandnotfound.cn ~]$ diff -u file1 file2

实例11:使用-q选项仅显示有差异的文件名
如果你在比较两个大目录,你可能只关心哪些文件有所不同,而不关心具体是怎么不同的。在这种情况下,你可以使用 -q 选项。

[linux@bashcommandnotfound.cn ~]$ diff -q directory1 directory2

实例12:显示文件差异的统计信息
如果你想要查看文件差异的统计信息,比如哪些行被修改了,改了多少次,你可以使用 diffstat 命令。diffstat 是一个读取 diff 命令的输出,并生成相应的修改/插入/删除统计信息的命令。

[linux@bashcommandnotfound.cn ~]$ diff -uN dir1 dir2 | diffstat

实例13:两种忽略所有空白及制表符的方式
在进行文件差异比较的时候,我们有时需要忽略所有的空白和制表符的变化,可以使用 -b 或者 -w 选项。

[linux@bashcommandnotfound.cn ~]$ diff -b file1 file2

或者

[linux@bashcommandnotfound.cn ~]$ diff -w file1 file2

实例14:生产patch包
diff 命令常用于生成 patch 包。这是一种很有效的更新软件的方式,只需通过 diff 命令比较新旧两个版本之间的差异,并将差异制作成 patch 包。

[linux@bashcommandnotfound.cn ~]$ diff -Naur olddir newdir > update.patch

实例15:按字节比较文件
diff 命令默认是按行比较文件,如果我们要在二进制文件或者需要按字节比较的时候,我们可以结合 cmp 命令来使用。

[linux@bashcommandnotfound.cn ~]$ cmp -l file1 file2 | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}'

这将按字节对比 file1 和 file2,并输出不同的字节的位置和值。

Linux diff命令的注意事项
从输出结果中,我们可以看到,diff 命令并不会简单的告诉我们哪些行有差异,而是会以一种更结构化的方式告诉我们应该如何从一个文件“改编”到另一个文件。

三维半岛官网: http://www.thanksview.com

进入首页