简介
diff用来比较两个文件。当然文件比较的工具很多,windows系统下面就有不错的工具可以使用,例如常用的Beyond Compare,WinMerge都是图形界面的比较工具而且使用非常方便,如果你仅仅是在windows下工作,这些GUI的比较工具绝对是首选。对于在linux环境下工作的人来说,如果每次想看两个文件的区别都要将文件下载到windows环境然后用图形工具进行比较实在是太麻烦了。那么我们必须学会使用linux环境下的比较工具diff。
1、diff如何工作
diff分析两个文件,并输出两个文件的不同的行。diff的输出结果表明需要对一个文件做怎样的操作之后才能与第二个文件相匹配。diff并不会改变文件的内容,但是diff可以输出一个ed脚本来应用这些改变。
2、基本语法
diff file1 file2
3、参数说明
参数 | 说明 |
---|---|
-a | 或者—text,diff预设只会逐行比较文本文件 |
-b | 或—ignore-space-change ,不检查空格字符的不同。 |
-B | 或—ignore-blank-lines ,不检查空白行。 |
-c | 显示全部内容,并标出不同之处 |
-C<行数> | 或—context行数 与执行”-c-行数”指令相同。 |
-i | 或—ignore-case ,不检查大小写的不同。 |
-p | 若比较的文件为C语言的程序码文件时,显示差异所在的函数名称 |
-N | 或—new-file ,在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。 |
-P | 或—unidirectional-new-file ,与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。 |
-r | 比较子目录中的文件 |
-v | 显示版本信息 |
-w | 或—ignore-all-space , 忽略全部的空格字符。 |
-W | 或—width , 在使用-y参数时,指定栏宽。默认值:130 |
-x | 或—exclude , 不比较选项中所指定的文件或目录。 |
-X | 或—exclude-from , 您可以将文件或目录类型存成文本文件,然后在=中指定此文本文件。 |
-y | 或—side-by-side ,以并列的方式显示文件的异同之处。 |
—left-column | 在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。 |
—suppress-common-lines | 在使用-y参数时,仅显示不同之处。 |
举个栗子一
1、先创建2个文件
# 文件1
[root@master home]# vim file1
1
2
3
4
5
6
7
8
# 文件2
[root@master home]# vim file2
1
c
3
4
5
6
7
8
2、比较
使用diff比较他们的不同,输出以下结果
[root@master home]# diff file1 file2
2c2
< 2
---
> c
2.1、比较说明 2c2
要明白diff比较结果的含义,我们必须牢记一点,diff描述两个文件不同的方式是告诉我们怎么样改变第一个文件之后与第二个文件匹配。
2c2
我们看看上面的比较结果中的第一行 2c2 前面的数字2表示第一个文件中的行,中间有一个字母c表示需要在第一个文件上做的操作(a=add,c=change,d=delete),详情请看下面的表格说明,后面的数字2表示第二个文件中的行。
指令 | 说明 |
---|---|
a | add 的简写,表示需要在第一个文件的指定行添加字符后才能与第二个文件匹配 |
c | change 的简写,表示需要在第一个文件的指定行修改字符后才能与第二个文件匹配 |
d | delete 的简写,表示需要在第一个文件的指定行删除后才能与第二个文件匹配 |
< 2
:删除 2所在的行
> c
: 所在行添加 c
所以,上面2c2
的含义是:在第一个文件file1将2行的字符2
换成c
,就和第二个文件一样了;
2.2、图形界面的比较
通过 windows的Beyond Compare软件进行比较,就可以很直观地看到,是第二行不同
举个栗子二
1、创建2个文件
# 文件1
[root@master home]# vim 1.txt
1
3
4
5
6
7
8
# 文件2 (注意:第3行是空行)
[root@master home]# vim 2.txt
134567
yexindong
woaini
1
2
3
4
2、比较
使用diff比较他们的不同,输出以下结果,仔细看,有3个不同的地方
[root@master home]# diff 1.txt 2.txt
0a1,4
> 134567
> yexindong
>
> woaini
1a6
> 2
4,7d8
< 5
< 6
< 7
< 8
2.1、比较结果说明:0a1,4
先看第一个,0a1,4
指的是第一个文件第0行加上以下>
中的内容,就和第二个文件的1~4行一样了;
0a1,4
> 134567
> yexindong
>
> woaini
2.2、比较结果说明:1a6
第二个不同的地方:1a6
,指的是第一个文件的第一行后面加上 2,就和第二个文件的第6行一样了;
1a6
> 2
2.3、比较结果说明:4,7d8
第三个不同的地方:4,7d8
,指的是删除第一个文件 4~7(包含4,5,6,7行)行的内容,就和第二个文件的第8行一样了
4,7d8
< 5
< 6
< 7
< 8
3、比较的另一种方式
3.1、使用-u
参数显示文件差别
也可以使用 -u 参数来直接显示出两个文件的区别;
[root@master home]# diff -u 1.txt 2.txt
--- 1.txt 2023-01-06 14:09:40.430676333 +0800
+++ 2.txt 2023-01-16 09:47:04.179507148 +0800
@@ -1,7 +1,8 @@
+134567
+yexindong
+
+woaini
1
+2
3
4
-5
-6
-7
-8
3.2、使用 -y
参数显示文件差别
显示2个文件所有内容和差别;
[root@master home]# diff -y 1.txt 2.txt
> 134567
> yexindong
>
> woaini
1 1
> 2
3 3
4 4
5 <
6 <
7 <
8 <
加上 --suppress-common-lines
参数时仅显示差别
[root@master home]# diff -y --suppress-common-lines 1.txt 2.txt
> 134567
> yexindong
>
> woaini
> 2
5 <
6 <
7 <
8 <
2.4、图形界面的比较
其他用法栗子
1、比较2个文件,并将结果输出到文件
diff 1.txt 2.txt -y > diff.txt
2、比较2个目录的差别
# 第一个目录
src/
├── test1
│ └── one
├── test2
└── test3
4 directories, 0 files
# 第二个目录
dst/
├── test1
├── test2
│ └── one
└── test3
4 directories, 0 files
# diff进行比较
> diff -r src/ dst/
Only in src/test1: one
Only in dst/test2: one