diff 命令详解
diff 命令详解
【⾃注:】
1,还有个colordiff命令,⽤颜⾊标识不同的地⽅。需要先安装
2,diff normal模式中 2,5表⽰从第⼆⾏到第五⾏
3,diff -c 模式中,2,5表⽰从第⼆⾏到第五⾏
4,diff -u模式中,2,5表⽰从第⼆⾏开始的连续5⾏,即第2,3,4,5,6⾏
1.概述
本⽂将要讨论的是diff命令,diff⽤来⽐较两个⽂件。当然⽂件⽐较的⼯具很多,windows系统下⾯就有不错的⼯具可以使⽤,例如常⽤的Beyond Compare,WinMerge都是图形界⾯的⽐较⼯具⽽且使⽤⾮常⽅便,如果你仅仅是在windows下⼯作,这些GUI的⽐较⼯具绝对是⾸选。对于在linux环境下⼯作的⼈来说,如果每次想看两个⽂件的区别都要将⽂件下载到windows环境然后⽤图形⼯具进⾏⽐较实在是太⿇烦了。那么我们必须学会使⽤linux环境下的⽐较⼯具diff。
2.diff 命令如何⼯作,如何理解diff 的执⾏结果
diff分析两个⽂件,并输出两个⽂件的不同的⾏。diff的输出结果表明需要对⼀个⽂件做怎样的操作之后才能与第⼆个⽂件相匹配【或者这么理解:与第⼀个⽂件相⽐,第⼆个⽂件发⽣了那些变化】【git
diff的结果输出也是如此】。diff并不会改变⽂件的内容,但是diff可以输出⼀个ed脚本来应⽤这些改变。
现在让我们来看⼀下diff是如何⼯作的,假设有两个⽂件:输出如下结果://
I need to buy apples.
I need to run the laundry.I need to wash the dog.
I need to get the car detailed.
//
I need to buy apples.
I need to do the laundry.
I need to wash the car.
I need to get the dog detailed.
我们使⽤diff ⽐较他们的不同:
2,4c2,4
< I need to run the laundry.
< I need to wash the dog.
< I need to get the car detailed.
---
> I need to do the laundry.
> I need to wash the car.
> I need to get the dog detailed.
我们来说明⼀下该输出结果的含义,要明⽩diff⽐较结果的含义,我们必须牢记⼀点,diff描述两个⽂件不同的⽅式是告诉我们怎么样改变第⼀个⽂件之后与第⼆个⽂件匹配。我们看看上⾯的⽐较结果中的第⼀⾏
2,4c2,4
前⾯的数字2,4表⽰第⼀个⽂件中的⾏,中间有⼀个字母c表⽰需要在第⼀个⽂件上做的操作(a=add,c=change,d=delete),后⾯的数字2,4表⽰第⼆个⽂件中的⾏。
2,4c2,4
的含义是:第⼀个⽂件中的第[2,4]⾏(注意这是⼀个闭合区间,包括第2⾏和第4⾏)需要做出修改才能与第⼆个⽂件中的[2,4]⾏相匹配。
接下来的内容则告诉我们需要修改的地⽅,前⾯带 < 的部分表⽰左边⽂件的第[2,4]⾏的内容,⽽带>
的部分表⽰右边⽂件的第[2,4]⾏的内容,中间的 — 则是两个⽂件内容的分隔符号。
3.Normal模式
上⾯的部分我们说明了如何查看diff命令的结果,实际上对于上⾯的⽐较,我们使⽤的是diff命令的Normal模式,这也是diff命令的默认模式,也就是说diff两个⽂件的时候如果不加模式参数则是默认模式进⾏⽐较,其效果与(–normal)⼀样,我们举⼀些例⼦来说明Normal模式下的输出结果(前⾯已经说明了⼀种⽐较结果),为了直观查看两个⽂件的不同我在windows下⾯通过BeyondCompare ⼯具列出两个⽂件的不同,⽽截图下⾯的⿊⾊部分则是diff的⽐较输出截图。
第⼀个⽂件⽐第⼆个⽂件少了⾏的情况:
第⼀个⽂件⽐第⼆个⽂件多出⾏的情况:
以上diff命令执⾏的时候没有指定额外的模式参数,所以其使⽤的是默认的Normal模式,效果与添加命令⾏参数–normal 是⼀样的。
4.Context模式
默认情况下的模式输出结果实际上是符合计算机的思维⽅式,不太直观,所以其输出结果并不能够很好的被⼈理解,diff命令除了默认模式之外还提供了另外两种模式,Context和Unified模式,本节我们说说如何查阅Context模式下的输出结果。diff命令应⽤Context模式只需要添加命令⾏参数 diff -c 即可,我们先看看两个案例⽂件:
接下来说明这两个⽂件以diff -c ⽅式⽐较的结果:
5.Unified模式
diff还有⼀种⽐较⽅式,也即Unified模式,使⽤命令⾏ –u 来执⾏该模式的⽐较。其⽐较结果与Context
模式很像,但是简化了⼀些输出,我们看看我们的案例⽂件,与上⾯的⼀样:
使⽤diff –u ⽐较的结果:
6.⽐较⽬录
使⽤diff命令可以⽐较两个⽬录,其⽐较格式是 diff directory1 directory2 查看如下⽬录⽐较结果:
⽐较两个⽬录的时候⽆⾮是有的⽂件仅仅存在于某个⽬录中⽽在另⼀个⽬录中没有,如果存在同名的⽂件,则⽐较这两个⽂件的不同。diff ⽐较⽬录的结果我们可以结合grep命令筛选出我们想要的输出,例如仅仅输出两个⽬录下不同的⽂件⽽忽略掉某⼀个⽬录独有另⼀个⽬录不存在的输出记录。
7.⼀些有⽤的参数
diff还提供了⼀些有⽤的参数来控制⽐较⾏为与输出结果,⼀些常⽤的参数如下:
diff - 2.txt >
这样就是⽣成了⼀个ed可以执⾏的脚本⽂件,⽣成脚本⽂件之后我们还需要做⼀个操作, 在
脚本⽂件末尾添加ed的write指令,只需要执⾏ echo “w” >& 将w指令附加到脚本⽂件的最后⼀⾏即可。
那么如何应⽤该脚本⽂件呢,可以这样使⽤:ed - 1.txt < -b --ignore-space-change
忽略空格,如果两⾏进⾏⽐较,多个连续的空格会被当作⼀个空格处理,同时会忽略掉⾏尾的空格差异。
-w --ignore-all-space 忽略所有空格,忽略范围⽐-b 更⼤,包括很多不可见的字符都会忽略。
-B 忽略空⽩⾏。
-y 输出两列,⼀个⽂件⼀列,有点类似GUI 的输出外观了,这种⽅式输出更加直观。
-W ⼤写W ,当指定-y 的时候设置列的宽度,默认是130
-x, --exclude=PAT ⽐较⽬录的时候排除指定PAT 模式的⽂件名的⽐较
-i, --ignore-case 忽略两个⽂件中⼤⼩写的不同
-e 将⽐较的结果保存成⼀个ed 脚本,之后ed 程序可以执⾏该脚本⽂件,从⽽将file1修改成与file2的内git常用指令
容相同,这⼀般在patch 的时候有⽤。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论