写点什么

Linux 下 diff 的操作详解

用户头像
良知犹存
关注
发布于: 2020 年 10 月 19 日

总述

      Linux diff 命令用于比较文件的差异。diff 以逐行的方式,比较文本文件的异同处。特别是比较两个版本不同的文件,如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录。diff 命令可以同时输出成补丁文件,并且 Linux 中还有一个 patch 命令,可以依据 diff 生成的.patch 补丁文件,将 a.c 与 b.c 两个文件差异部分更新到需要修改的文件。此外 diff 在 SVN 、GIT、CVS 等版本控制工具中也是不可获取的一部分。

      下面我就详细描述一下 diff 命令的使用:

作者:良知犹存

转载授权以及围观:欢迎添加微信公众号:Conscience_Remains

1 指令格式


在 Linux 中,我们可以使用 diff --help 查看详细指导(篇幅有限只截图了一部分作为展示)




常用命令格式:

diff[参数][文件 1 或目录 1][文件 2 或目录 2]


常用命令展示:


1.Linux 内核 diff 自定义的补丁


diff -ruN linux-4.19-rc3_lyn linux-4.19-rc3 > linux-4.19-rc3_lyn.patch
复制代码


这个是我经常使用的命令,用来比较生成我修改后的代码的补丁包,最后用 patch 命令打补丁到需要使用的内核源码中去




2.在 git 中也会有 diff 可以查看两次版本的差异

git diff 04120e84525eca1c590d30b84ce7463b9e8a1497 f88b0054170b99b149bd0fbe5f138c66c64dd1c6
复制代码


其中 diff 之后的版本号通过 git log 打印出来进行比较




2 命令参数详细解释


-<行数>:指定要显示多少行的文本。此参数必须与-c 或-u 参数一并使用;

-a 或--text:diff 预设只会逐行比较文本文件;

-b 或--ignore-space-change:不检查空格字符的不同;

-B 或--ignore-blank-lines:不检查空白行;

-c:显示全部内容,并标出不同之处;

-C<行数>或--context<行数>:与执行“-c-<行数>”指令相同;

-d 或——minimal:使用不同的演算法,以小的单位来做比较;

-D<巨集名称>或 ifdef<巨集名称>:此参数的输出格式可用于前置处理器巨集;

-e 或——ed:此参数的输出格式可用于 ed 的 script 文件;

-f 或-forward-ed:输出的格式类似 ed 的 script 文件,但按照原来文件的顺序来显示不同处;

-H 或--speed-large-files:比较大文件时,可加快速度;

-l<字符或字符串>或--ignore-matching-lines<字符或字符串>:若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异;

-i 或--ignore-case:不检查大小写的不同;

-l 或——paginate:将结果交由 pr 程序来分页;

-n 或——rcs:将比较结果以 RCS 的格式来显示;

-N 或--new-file:在比较目录时,若文件 A 仅出现在某个目录中,预设会显示:Only in 目录,文件 A 若使用-N 参数,则 diff 会将文件 A 与一个空白的文件比较;

-p:若比较的文件为 C 语言的程序码文件时,显示差异所在的函数名称;

-P 或--unidirectional-new-file:与-N 类似,但只有当第二个目录包含了第一个目录所没有的文件时,才会将这个文件与空白的文件做比较;

-q 或--brief:仅显示有无差异,不显示详细的信息;

-r 或——recursive:比较子目录中的文件;

-s 或--report-identical-files:若没有发现任何差异,仍然显示信息;

-S<文件>或--starting-file<文件>:在比较目录时,从指定的文件开始比较;

-t 或--expand-tabs:在输出时,将 tab 字符展开;

-T 或--initial-tab:在每行前面加上 tab 字符以便对齐;

-u,-U<列数>或--unified=<列数>:以合并的方式来显示文件内容的不同;

-v 或——version:显示版本信息;


3 diff 输出的文件解释


说完了 diff 命令的操作,我们再来看看 diff 命令输出文件,因为有时候我们通过输出信息自己比对文件的差异结论。


1.diff 直接输出到终端显示




说明:

  • "<"表示后面文件比前面文件少了 1 行内容

  • ">"表示后面文件比前面文件多了 1 行内容


2.diff 直接输出为 patch 文件查看



如图所示,我打开了我对比内核代码之后生成的.patch 文件为例:

里面有每个文件都会标注

Binary files linux-4.19-rc3_lyn/arch/arm/boot/compressed/ashldi3.o and linux-4.19-rc3/arch/arm/boot/compressed/ashldi3.o differdiff -ruN linux-4.19-rc3_lyn/arch/arm/boot/compressed/.ashldi3.o.cmd linux-4.19-rc3/arch/arm/boot/compressed/.ashldi3.o.cmd--- linux-4.19-rc3_lyn/arch/arm/boot/compressed/.ashldi3.o.cmd  1970-01-01 08:00:00.000000000 +0800+++ linux-4.19-rc3/arch/arm/boot/compressed/.ashldi3.o.cmd  2020-08-21 10:54:52.774658500 +0800@@ -0,0 +1,80 @@+cmd_arch/arm/boot/compressed/ashldi3.o := arm-linux-gnueabi-gcc -Wp,-MD,arch/arm/boot/compressed/.ashldi3.o.d  -nostdinc -isystem /work/tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/..        /lib/gcc/arm-linux-gnueabi/4.9.4/include -I./arch/arm/include -I./arch/arm/include/generated  -I./include -I./arch/arm/include/uapi -I./arch/arm/include/generated/uapi -I./include/uapi -I./include/ge        nerated/uapi -include ./include/linux/kconfig.h -D__KERNEL__ -Iarch/arm/mach-s3c24xx/include -Iarch/arm/plat-samsung/include -D__ASSEMBLY__ -fno-PIE -DCC_HAVE_ASM_GOTO -funwind-tables -marm -Wa,-mno-        warn-deprecated -D__LINUX_ARM_ARCH__=4 -march=armv4t -mtune=arm9tdmi -include asm/unified.h -msoft-float -Wa,-gdwarf-2 -DZIMAGE   -c -o arch/arm/boot/compressed/ashldi3.o arch/arm/boot/compressed/ash        ldi3.S++source_arch/arm/boot/compressed/ashldi3.o := arch/arm/boot/compressed/ashldi3.S++deps_arch/arm/boot/compressed/ashldi3.o := \
复制代码


第一部分,也是文件的基本信息:

--- linux-4.19-rc3_lyn/arch/arm/boot/compressed/.ashldi3.o.cmd  1970-01-01 08:00:00.000000000 +0800

+++ linux-4.19-rc3/arch/arm/boot/compressed/.ashldi3.o.cmd  2020-08-21 10:54:52.774658500 +0800


"---"表示变动前的文件,"+++"表示变动后的文件。


第二部分,变动的位置用两个 @作为起首和结束。


   @@ -0,0 +1,80 @@

前面的"-0,0"分成三个部分:减号表示第一个文件(即 linux-4.19-rc3_lyn/arch/arm/boot/compressed/.ashldi3.o.cmd),"0"表示第 0 行,后一个"0"表示连续 0 行;同样的,"+1,10",加号表示第二个文件,就表示下面是第二个文件从第 1 行开始的连续 80 行。


通过这些信息我们就可以看懂对比之后文件的差异处了,是不是很容易呢。


 这就是我分享的 linux 下 diff 命令,如果大家有什么更好的思路,欢迎分享交流哈。



更多分享,扫码关注我


发布于: 2020 年 10 月 19 日阅读数: 74
用户头像

良知犹存

关注

还未添加个人签名 2020.05.29 加入

还未添加个人简介

评论

发布
暂无评论
Linux下diff的操作详解