Linux下diff的操作详解

总述

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

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

作者:良知犹存

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

在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 打印出来进行比较

    -<行数>:指定要显示多少行的文本。此参数必须与-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:显示版本信息;

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

  • ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 219,490评论 6 508
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 93,581评论 3 395
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 165,830评论 0 356
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 58,957评论 1 295
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 67,974评论 6 393
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 51,754评论 1 307
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 40,464评论 3 420
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 39,357评论 0 276
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 45,847评论 1 317
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 37,995评论 3 338
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 40,137评论 1 351
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 35,819评论 5 346
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 41,482评论 3 331
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 32,023评论 0 22
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 33,149评论 1 272
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 48,409评论 3 373
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 45,086评论 2 355