本文将要讨论的是diff命令,diff用来比较两个文件。固然文件比较的工具不少,windows系统下面就有不错的工具可使用,例如经常使用的Beyond Compare,WinMerge都是图形界面的比较工具并且使用很是方便,若是你仅仅是在windows下工做,这些GUI的比较工具绝对是首选。对于在linux环境下工做的人来讲,若是每次想看两个文件的区别都要将文件下载到windows环境而后用图形工具进行比较实在是太麻烦了。那么咱们必须学会使用linux环境下的比较工具diff。linux
diff分析两个文件,并输出两个文件的不一样的行。diff的输出结果代表须要对一个文件作怎样的操做以后才能与第二个文件相匹配。diff并不会改变文件的内容,可是diff能够输出一个ed脚原本应用这些改变。
如今让咱们来看一下diff是如何工做的,假设有两个文件:windows
//file1.txt
I need to buy apples.
I need to run the laundry.
I need to wash the dog.
I need to get the car detailed.
//file2.txt
I need to buy apples.
I need to do the laundry.
I need to wash the car.
I need to get the dog detailed.app
咱们使用diff比较他们的不一样:
diff file1.txt file2.txt工具
输出以下结果:
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.spa
咱们来讲明一下该输出结果的含义,要明白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]行的内容,中间的 --- 则是两个文件内容的分隔符号。3d
上面的部分咱们说明了如何查看diff命令的结果,实际上对于上面的比较,咱们使用的是diff命令的Normal模式,这也是diff命令的默认模式,也就是说diff两个文件的时候若是不加模式参数则是默认模式进行比较,其效果与(--normal)同样,咱们举一些例子来讲明Normal模式下的输出结果(前面已经说明了一种比较结果),为了直观查看两个文件的不一样我在windows下面经过BeyondCompare工具列出两个文件的不一样,而截图下面的黑色部分则是diff的比较输出截图。版本控制
第一个文件比第二个文件少了行的状况:orm
第一个文件比第二个文件多出行的状况:blog
第一个文件与第二个文件不相同的状况:
以上diff命令执行的时候没有指定额外的模式参数,因此其使用的是默认的Normal模式,效果与添加命令行参数--normal 是同样的。
默认状况下的模式输出结果其实是符合计算机的思惟方式,不太直观,因此其输出结果并不可以很好的被人理解,diff命令除了默认模式以外还提供了另外两种模式,Context和Unified模式,本节咱们说说如何查阅Context模式下的输出结果。diff命令应用Context模式只须要添加命令行参数 diff -c 便可,咱们先看看两个案例文件:
接下来讲明这两个文件以diff -c 方式比较的结果:
diff还有一种比较方式,也即Unified模式,使用命令行 –u 来执行该模式的比较。其比较结果与Context模式很像,可是简化了一些输出,咱们看看咱们的案例文件,与上面的同样:
使用diff –u 比较的结果:
能够看到其比较结果与Context模式实际上差很少,只不过将比较结果合并到一块儿了。
使用diff能够比较两个目录,其比较格式是 diff directory1 directory2 查看以下目录比较结果:
比较两个目录的时候无非是有的文件仅仅存在于某个目录中而在另外一个目录中没有,若是存在同名的文件,则比较这两个文件的不一样。diff比较目录的结果咱们能够结合grep命令筛选出咱们想要的输出,例如仅仅输出两个目录下不一样的文件而忽略掉某一个目录独有另外一个目录不存在的输出记录。
另外比较目录的时候有两个参数颇有用,-r 和 -q ,前者表示递归比较目录中的子目录,后者表示仅仅列出两个目录中有哪些文件不一样,而不去比较目录中各个文件的具体内容。特别是在做版本控制的时候,比较的两个目录若是文件不少,咱们可能只须要知道两个目录有那些文件有差别就好了,而不须要diff列出具体的差别内容,由于文件不少,默认状况下diff会输出两个目录全部不一样文件的内容差别,这会使得输出不少很杂乱,加上-q以后则只会输出不一样的文件名。
diff -r -q directory1 direcotory2
diff还提供了一些有用的参数来控制比较行为与输出结果,一些经常使用的参数以下:
-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的内容相同,这通常在patch的时候有用。
-r 若是比较两个目录,-r参数会比较其下同名的子目录
-q 输出结果中,只指出两个文件不一样,而不输出两个文件具体内容的比较,这在比较两个目录的时候很好用。咱们只须要知道两个目录下那些文件作了修改,而不须要知道每一个文件具体修改了那些内容。特别是当两个目录文件不少的时候。
diff -e 1.txt 2.txt > script.txt
这样就是生成了一个ed能够执行的脚本文件script.txt,生成脚本文件以后咱们还须要作一个操做, 在脚本文件末尾添加ed的write指令,只须要执行 echo "w" >>script.txt 将w指令附加到脚本文件的最后一行便可。
那么如何应用该脚本文件呢,能够这样使用:
ed - 1.txt < script.txt
注意中间的 – 符号表示从标准输入中读取,而 < script.txt 则重定向script.txt的内容到标准输入。这样执行以后1.txt的内容将与2.txt彻底相同。
若是您以为这篇文章对您有帮助,须要您的【赞】,让更多的人也能看见哦