Linux 下 diff 的操作详解
总述
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 自定义的补丁
这个是我经常使用的命令,用来比较生成我修改后的代码的补丁包,最后用 patch 命令打补丁到需要使用的内核源码中去
2.在 git 中也会有 diff 可以查看两次版本的差异
其中 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 文件为例:
里面有每个文件都会标注
第一部分,也是文件的基本信息:
--- 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 命令,如果大家有什么更好的思路,欢迎分享交流哈。
更多分享,扫码关注我
版权声明: 本文为 InfoQ 作者【良知犹存】的原创文章。
原文链接:【http://xie.infoq.cn/article/29921250fb8a0d77700505063】。文章转载请联系作者。
评论