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
对于基于 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 命令并不会简单的告诉我们哪些行有差异,而是会以一种更结构化的方式告诉我们应该如何从一个文件“改编”到另一个文件。如果提示bash: diff: command not found
,则可能是 diff 命令没有被安装,可以按照上述方式进行安装。 Linux diff相关命令
cmp命令:比较两个文件是否有差异
diff3命令:对比三个文件的差异