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自定义的补丁
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 differ
diff -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命令,如果大家有什么更好的思路,欢迎分享交流哈。

更多分享,扫码关注我
Linux下diff的操作详解的更多相关文章
- Linux下diff命令用法详解
大家好,我是良许. 我们在平时工作的时候,经常要知道两个文件之间,以及同个文件不同版本之间有何异同点.在 Windows 下,有 beyond compare 这个好用的工具,而在 Linux 下,也 ...
- Linux 下 SVN 命令操作详解
1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain ...
- Linux下的文件目录结构详解
Linux下的文件目录结构详解 / Linux文件系统的上层根目录 /bin 存放用户可执行的程序 /boot 操作系统启动时所需要的文件 /dev 接口设备文件目录,例如:had表示硬盘 /etc ...
- linux下sort命令使用详解---linux将文本文件内容加以排序命令
转载自:http://www.cnblogs.com/hitwtx/archive/2011/12/03/2274592.html linux下sort命令使用详解---linux将文本文件内容加以排 ...
- Linux Shell数组常用操作详解
Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...
- Linux下tomcat的安装详解
Linux下tomcat的安装详解 来源: ChinaUnix博客 日期: 2007.01.21 22:59 (共有0条评论) 我要评论 一,安装前的准备:1,Linux版本:我的是企业版.(至于红帽 ...
- Linux下find命令用法详解
Linux下find命令用法详解 学神VIP烟火 学神IT教育:XueGod-IT 最负责任的线上直播教育平台 本文作者为VIP学员 烟火 第一部分:根据文件名查找 1.在当前目录 ...
- linux下getsockopt和setsockopt详解及测试
linux下getsockopt和setsockopt详解及测试 NAME 名字 getsockopt, setsockopt - get and set options on sockets 获取或 ...
- Linux下DNS服务器搭建详解
Linux下DNS服务器搭建详解 DNS 即Domain Name System(域名系统)的缩写,它是一种将ip地址转换成对应的主机名或将主机名转换成与之相对应ip地址的一种机制.其中通过域名解析 ...
随机推荐
- 容器编排系统K8s之Pod Affinity
前文我们了解了k8s上的NetworkPolicy资源的使用和工作逻辑,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14227660.html:今天我们来聊 ...
- linux系统操作系统网卡漂移解决方案及问题原因
一.问题描述 公司有100-150台服务器安装RHEL7.4&中标麒麟7.4系统,为方便编辑配置网卡,使用脚本方式配置为biosname=0,ifname=0,目的是为将en1o2p此类长字符 ...
- STL小结
\(\mathcal{STL}(\mathcal{Standard\ Template\ Library})\) \(queue\) (队列): 这是一种先进先出的数据结构. 主要操作: 操作 功能 ...
- 原生redis命令
一. redis-cli 连接 redis 进入redis安装目录 cd /usr/local/bin 进入redis客户端 ./redis-cli -p 6379 -h 用于指定 ip -p 用于指 ...
- phpstorm2020.1最新版永久破解
phpstorm最新安装包以及破解包下载 链接:https://pan.baidu.com/s/177DyhBWP7Lek2IAd-CVJbg 提取码:rhpz 下载安装以及先选择试用什么的傻瓜式操作 ...
- 【Git】命令行操作
Git 命令行操作 1 本地库初始化 git init:初始化本地仓库 效果 注意:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改. 2 设置签名 形式: 用户名:tom E ...
- 【Java】集合综合案例 - 播放器管理
集合综合案例 文章目录 集合综合案例 需求分析 项目演示 详细设计 代码实现 歌曲类 播放器类 播放列表类 测试 参考资料 播放器管理 需求分析 项目演示 详细设计 代码实现 重新搞一波 复习巩固 简 ...
- 【Linux】find删除365天以前的文件详细解析
find . -name "*" -mtime +365 -exec rm -rf {} \; -mtime +365 文件被修改的时间,最后一次发生到现在365天 -atime ...
- 记一次centos7重启后docker无法启动的问题
问题描述 在重新了centos7系统后,docker突然就启动不了了,查看报错信息 [root@localhost ~]# systemctl status docker.service ● dock ...
- JAVA获取当前文件路径this.getClass().getResource方法详细讲解
public class Test { public void run() { // TODO Auto-generated method stub System.out.println(" ...