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

更多分享,扫码关注

原文作者:良知犹存

原文链接:https://www.cnblogs.com/conscience-remain/p/13838465.html

更多推荐

更多
  • Linux二进制-一、Linux 环境及其工具 Linux 工具,有用的设备和文件,与连接器相关的环境点,GDB,Objdump from GNU binutils,Objcopy from GNU binutils,strace,追踪,基本 ltrace 命令,ftrace,rea
    Apache CN

  • Linux二进制-零、前言 这本书的内容,你需要什么来写这本书,这本书是写给谁的,约定,读者反馈,客户支持,示例代码下载,勘误表,盗版,问题, 软件工程是创造一项在微处理器上存在、存在和呼吸的发明。 我们称之为程序。 逆向工程的行为发现这个项目如何生活和呼吸,而且
    Apache CN

  • Linux二进制-二、ELF 二进制格式 ELF 文件类型,ELF 程序头文件,ELF 节标题,精灵符号,ELF 重置,ELF 动态链接,编写 ELF 解析器,pt_load,PT_DYNAMICPhdr 为动态段,pt_note,pt_interp,PT_PHDR,文本部
    Apache CN

  • Linux二进制-五、Linux 二进制程序保护 ELF 二进制封隔器哑保护,存根机制和用户域执行,由保护根执行的其他工作,已有的 ELF 二进制保护,下载 maya 保护的二进制文件,反调试二进制保护,抗仿真,模糊处理方法,保护控制流的完整性,其他资源,保护器的一个例子,DacryF
    Apache CN

  • Linux二进制-九、Linux `/proc/kcore`分析 九、Linux /proc/kcore分析Linux 内核取证和 rootkit,普通 vmlinux 没有符号,/proc/kcore 和 GDB 探索,直接修改 sys_call_table,Kprobe rootkits,VFS
    Apache CN

  • Linux二进制-三、Linux 进程跟踪 ptrace 的重要性,进程寄存器状态和标志,一个简单的基于实践的调试器,一个简单的 ptrace 调试器,具有进程附加功能,高级功能跟踪软件,ptrace 和法医学分析,处理图像重建从内存到可执行文件,简单的例子并不总是那么微不足道,
    Apache CN

  • 四、ELF 病毒技术——Linux/Unix 病毒 ELF 病毒技术,ELF 病毒工程挑战,ELF 病毒寄生虫感染方法,PT_NOTE 到 PT_LOAD 转换感染方法,感染控制流程,ELF 防调试和包装技术,ELF 病毒检测及消毒,寄生代码必须是自包含的,字符串存储的复杂性,寻找存储寄
    Apache CN

  • Linux二进制-七、进程内存取证 流程是什么样子的?,进程内存感染,Linux ELF 核心文件,可执行内存映射,程序堆,共享库映射,堆栈、vdso 和 vsycall,进程感染工具,工艺感染技术,Azazel userland rootkit 检测,进程地址空间的映射
    Apache CN

  • Linux二进制-八、扩展核心文件快照技术 历史,ECFS 理念,ECFS 入门,libecfs 用于解析 ECFS 文件的库,readecfs,使用 ECFS 检查受感染的进程,ECFS 参考指南,使用 ECFS 处理巫术,了解更多有关 ECFS,将 ECFS 插入核心处理器,
    Apache CN

  • Linux二进制-六、Linux 中的 ELF 二进制取证 检测入口点修改的科学,检测其他形式的控制流劫持,寄生虫代码特征识别,识别反向文本填充感染,识别文本段填充感染,标识受保护的二进制文件,IDA Pro,正在修补。ctors/。 init_array 节,检测 PLT/GOT 挂钩,检测蹦
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多