(转)Linux⽂本对⽐diff命令详解(整理)
1.概述
windows系统下⾯就有不错的⽂本对⽐⼯具可以使⽤,例如常⽤的Beyond Compare,WinMerge都是图形界⾯的⽐较⼯具⽽且使⽤⾮常⽅便,如果你仅仅是在windows下⼯作,这些GUI的⽐较⼯具绝对是⾸选。对于在linux环境下⼯作的⼈来说,如果每次想看两个⽂件的区别都要将⽂件下载到windows环境然后⽤图形⼯具进⾏⽐较实在是太⿇烦了。那么我们必须学会使⽤linux环境下的⽐较⼯具 diff。
diff命令在最简单的情况下,⽐较给定的两个⽂件的不同。如果使⽤“-”代替“⽂件”参数,则要⽐较的内容将来⾃标准输⼊。diff命令是以逐⾏的⽅式,⽐较⽂本⽂件的异同处。如果该命令指定进⾏⽬录的⽐较,则将会⽐较该⽬录中具有相同⽂件名的⽂件,⽽不会对其⼦⽬录⽂件进⾏任何⽐较操作。
语法
1. diff(选项)(参数)
选项
1. -<⾏数>:指定要显⽰多少⾏的⽂本。此参数必须与-c或-u参数⼀并使⽤;
2. -a或——text:diff预设只会逐⾏⽐较⽂本⽂件;
3. -b或--ignore-space-change:不检查空格字符的不同;
4. -B或--ignore-blank-lines:不检查空⽩⾏;
5. -c:显⽰全部内容,并标出不同之处;
6. -C<⾏数>或--context<⾏数>:与执⾏“-c-<⾏数>”指令相同;
7. -d或——minimal:使⽤不同的演算法,以⼩的单位来做⽐较;
8. -D<;巨集名称>或ifdef<;巨集名称>:此参数的输出格式可⽤于前置处理器巨集;
9. -e或——:此参数的输出格式可⽤于ed的script⽂件;
10. -f或-forward-ed:输出的格式类似ed的script⽂件,但按照原来⽂件的顺序来显⽰不同处;
11. -H或--speed-large-files:⽐较⼤⽂件时,可加快速度;
12. -l<;字符或字符串>或--ignore-matching-lines<;字符或字符串>:若两个⽂件在某⼏⾏有所不同,⽽之际航同时都包含了选项中指定的字
符或字符串,则不显⽰这两个⽂件的差异;
13. -i或--ignore-case:不检查⼤⼩写的不同;
14. -l或——paginate:将结果交由程序来分页;
15. -n或——rcs:将⽐较结果以RCS的格式来显⽰;
16. -N或--new-:在⽐较⽬录时,若⽂件A仅出现在某个⽬录中,预设会显⽰:Only in⽬录,⽂件A 若使⽤-N参数,则diff会将⽂件A 与⼀
个空⽩的⽂件⽐较;
17. -p:若⽐较的⽂件为C语⾔的程序码⽂件时,显⽰差异所在的函数名称;
18. -P或--unidirectional-new-file:与-N类似,但只有当第⼆个⽬录包含了第⼀个⽬录所没有的⽂件时,才会将这个⽂件与空⽩的⽂件做⽐
较;
19. -q或--brief:仅显⽰有⽆差异,不显⽰详细的信息;
20. -r或——recursive:⽐较⼦⽬录中的⽂件;
21. -s或--report-identical-files:若没有发现任何差异,仍然显⽰信息;
22. -S<⽂件>或--starting-file<⽂件>:在⽐较⽬录时,从指定的⽂件开始⽐较;
23. -t或---tabs:在输出时,将tab字符展开;
24. -T或--initial-tab:在每⾏前⾯加上tab字符以便对齐;
25. -u,-U<;列数>或--unified=<;列数>:以合并的⽅式来显⽰⽂件内容的不同;
26. -v或——version:显⽰版本信息;
27. -或--ignore-all-space:忽略全部的空格字符;
28. -W<;宽度>或--width<;宽度>:在使⽤-y参数时,指定栏宽;
29. -x<⽂件名或⽬录>或--exclude<⽂件名或⽬录>:不⽐较选项中所指定的⽂件或⽬录;
30. -X<⽂件>或--exclude-from<⽂件>;您可以将⽂件或⽬录类型存成⽂本⽂件,然后在=<⽂件>中指定此⽂本⽂件;
31. -y或--side-by-side:以并列的⽅式显⽰⽂件的异同之处;
32. --:显⽰帮助;
33. --left-column:在使⽤-y参数时,若两个⽂件某⼀⾏内容相同,则仅在左侧的栏位显⽰该⾏内容;
34. --suppress-common-lines:在使⽤-y参数时,仅显⽰不同之处。
还有个colordiff命令,⽤颜⾊标识不同的地⽅。需要先安装
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.
git常用指令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 ⽐较的结果:
可以看到其⽐较结果与Context模式实际上差不多,只不过将⽐较结果合并到⼀起了。
6.⽐较⽬录
使⽤diff可以⽐较两个⽬录,其⽐较格式是  diff  directory1  directory2 查看如下⽬录⽐较结果:
⽐较两个⽬录的时候⽆⾮是有的⽂件仅仅存在于某个⽬录中⽽在另⼀个⽬录中没有,如果存在同名的⽂件,则⽐较这两个⽂件的不同。diff ⽐较⽬录的结果我们可以结合grep命令筛选出我们想要的输出,例如仅仅输出两个⽬录下不同的⽂件⽽忽略掉某⼀个⽬录独有另⼀个⽬录不存在的输出记录。
7.参数 -e 将⽐较的结果保存成⼀个ed脚本,之后ed程序可以执⾏该脚本⽂件,从⽽将file1修改成与file2的内容相同,这⼀般在patch的时候有⽤。
diff  -e  1.txt  2.txt  >
这样就是⽣成了⼀个ed可以执⾏的脚本⽂件,⽣成脚本⽂件之后我们还需要做⼀个操作,在脚本⽂件末尾添加ed的write指令,只需要执⾏ echo "w" >& 将w指令附加到脚本⽂件的最后⼀⾏即可。
那么如何应⽤该脚本⽂件呢,可以这样使⽤:
ed  -  1.txt <
注意中间的 – 符号表⽰从标准输⼊中读取,⽽ < 则重定向的内容到标准输⼊。这样执⾏之后1.txt的内容将与2.txt完全相同。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。