diff 命令是 Linux 上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方。diff 在命令行中打印每一行的改动。最新版的 diff 还支持二进制文件。diff 程序的输出被称为补丁(patch),因为 Linux 系统中还有一个 patch 程序,可以根据 diff 的输出将 a.c 的文件内容更新为 b.c 。diff 是 svn、cvs、git 等版本控制工具不可或缺的一部分;
命令格式 - diff [参数] [文件1或目录1] [文件2或目录2]
命令功能 -
命令参数 -
-<行数> :指定要显示多少行的文本。此参数必须与 -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 :
-p :若比较的文件为 c语言的程序码文件 时,显示差异所在的函数名称;
-P或--unidirectional-new-file :与 -N 类似,但只有当第二个目录包含了第一个目录所没有的文件时,才会将这个文件与空白的文件做比较;
-q或--brief :仅显示有无差异,不显示详细信息;
-r或--recursive :比较子目录中的文件;
-s或--report-identical-files :若没有发现差异,仍然显示信息;
-S<文件>或--starting-file<文件> :在比较目录时,从指定的文件开始比较;
-t或--expand-tabs :在输出时,将 tab 字符展开;
-T或--initial-tabs :在每行前面加上 tab 字符以便对其;
-u或-U<列数>或--unified=<列数> :以合并的方式来显示文件内容的不同;
-v或--version :显示版本信息;
-w或--ignore-all-space :忽略全部的空格字符;
-W<宽度>或--width<宽度> :在使用 -y 参数时,指定栏宽;
-x<文件名或目录>或--exclude<文件名或目录> :不比较选项中指定的文件或目录;
-X<文件>或--exclude-from<文件> :你可以将文件或目录类型存成文本文件,然后在 =<文件> 中指定此文本文件;
-y或--side-by-side :以并列的方式显示文件的异同处;
--help :显示帮助;
--left-column :若使用 -y 参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示改行内容;
--suppress-common-lines :在使用 -y 参数时,仅显示不同之处;
命令实例 -
实例一:比较两个文件
命令
xxxxxxxxxx
11diff log2014.log log2013.log
输出
xxxxxxxxxx
121[root@localhost test3]# diff log2014.log log2013.log
23c3
3< 2014-03
4---
5> 2013-03
68c8
7< 2013-07
8---
9> 2013-08
1011,12d10
11< 2013-11
12< 2013-12
说明
上面的 3c3 和 8c8 表示 log2014.log 和 log2013.log 文件在第3行和第8行内容有所不同;
11,12d10 表示第一个文件比第二个文件多了第11和第12行;
diff 的 normal 显示格式有三种提示 :
a - add
c - change
d - delete
实例二:并排格式输出
命令
xxxxxxxxxx
11diff log2013.log log2014.log -y -W 50
输出
xxxxxxxxxx
261[root@localhost test3]# diff log2014.log log2013.log -y -W 50
22013-01 2013-01
32013-02 2013-02
42014-03 | 2013-03
52013-04 2013-04
62013-05 2013-05
72013-06 2013-06
82013-07 2013-07
92013-07 | 2013-08
102013-09 2013-09
112013-10 2013-10
122013-11 <
132013-12 <
14[root@localhost test3]# diff log2013.log log2014.log -y -W 50
152013-01 2013-01
162013-02 2013-02
172013-03 | 2014-03
182013-04 2013-04
192013-05 2013-05
202013-06 2013-06
212013-07 2013-07
222013-08 | 2013-07
232013-09 2013-09
242013-10 2013-10
25 > 2013-11
26 > 2013-12
说明
| 表示前后两个文件内容有不同
< 表示后面的文件比前面的文件少了1行内容
> 表示后面的文件比前面的文件多了1行内容
实例三:上下文格式输出
命令
xxxxxxxxxx
11diff log2013.log log2014.log -c
输出
xxxxxxxxxx
551[root@localhost test3]# diff log2013.log log2014.log -c
2*** log2013.log 2012-12-07 16:36:26.000000000 +0800
3--- log2014.log 2012-12-07 18:01:54.000000000 +0800
4***************
5*** 1,10 ****
6 2013-01
7 2013-02
8! 2013-03
9 2013-04
10 2013-05
11 2013-06
12 2013-07
13! 2013-08
14 2013-09
15 2013-10
16--- 1,12 ----
17 2013-01
18 2013-02
19! 2014-03
20 2013-04
21 2013-05
22 2013-06
23 2013-07
24! 2013-07
25 2013-09
26 2013-10
27+ 2013-11
28+ 2013-12[root@localhost test3]# diff log2014.log log2013.log -c
29*** log2014.log 2012-12-07 18:01:54.000000000 +0800
30--- log2013.log 2012-12-07 16:36:26.000000000 +0800
31***************
32*** 1,12 ****
33 2013-01
34 2013-02
35! 2014-03
36 2013-04
37 2013-05
38 2013-06
39 2013-07
40! 2013-07
41 2013-09
42 2013-10
43- 2013-11
44- 2013-12
45--- 1,10 ----
46 2013-01
47 2013-02
48! 2013-03
49 2013-04
50 2013-05
51 2013-06
52 2013-07
53! 2013-08
54 2013-09
55 2013-10[root@localhost test3]#
说明
开头作了比较文件的说明,这里有三种特殊字符:
+ 比较的文件的后者比前者多一行
- 比较的文件的后者比前者少一行
! 比较的文件两者有差别
实例四:统一格式输出
命令
xxxxxxxxxx
11diff log2014.log log2013.log -u
输出
xxxxxxxxxx
181[root@localhost test3]# diff log2014.log log2013.log -u
2--- log2014.log 2012-12-07 18:01:54.000000000 +0800
3+++ log2013.log 2012-12-07 16:36:26.000000000 +0800
4@@ -1,12 +1,10 @@
5 2013-01
6 2013-02
7-2014-03
8+2013-03
9 2013-04
10 2013-05
11 2013-06
12 2013-07
13-2013-07
14+2013-08
15 2013-09
16 2013-10
17-2013-11
18-2013-12
说明
它的第一部分,也就是文件的基本信息:
--- log2014.log 2012-12-07 18:01:54.000000000 +0800
+++ log2013.log 2012-12-07 16:36:26.000000000 +0800
--- 表示变动前的文件,+++ 表示变动后的文件;
第二部分,变动的位置用两个 @ 作为起首和结束:
@@ -1,12 +1,10 @@
前面的 -1,12 分为三个部分:- 表示第一个文件(即log2014.log),1 表示第1行,12 表示连续12行。合在一起,就表示下面是第一个文件从第1行开始的连续12行。
同样的,+1,10 表示变动后,成为第2个文件的从第1行开始的连续10行;
实例五:比较文件夹不同
命令
xxxxxxxxxx
11diff test3 test6
输出
xxxxxxxxxx
371[root@localhost test]# diff test3 test6
2Only in test6: linklog.log
3Only in test6: log2012.log
4diff test3/log2013.log test6/log2013.log
51,10c1,3
6< 2013-01
7< 2013-02
8< 2013-03
9< 2013-04
10< 2013-05
11< 2013-06
12< 2013-07
13< 2013-08
14< 2013-09
15< 2013-10
16---
17> hostnamebaidu=baidu.com
18> hostnamesina=sina.com
19> hostnames=true
20diff test3/log2014.log test6/log2014.log
211,12d0
22< 2013-01
23< 2013-02
24< 2014-03
25< 2013-04
26< 2013-05
27< 2013-06
28< 2013-07
29< 2013-07
30< 2013-09
31< 2013-10
32< 2013-11
33< 2013-12
34Only in test6: log2015.log
35Only in test6: log2016.log
36Only in test6: log2017.log
37[root@localhost test]#
说明
实例六:比较两个文件不同,并产生补丁
命令
xxxxxxxxxx
11diff -ruN log2013.log log2014.log >patch.log
输出
x
1[root@localhost test3]# diff -ruN log2013.log log2014.log >patch.log
2[root@localhost test3]# ll
3总计 12
4-rw-r--r-- 2 root root 80 12-07 16:36 log2013.log
5-rw-r--r-- 1 root root 96 12-07 18:01 log2014.log
6-rw-r--r-- 1 root root 248 12-07 21:33 patch.log
7[root@localhost test3]# cat patch.log
8--- log2013.log 2012-12-07 16:36:26.000000000 +0800
9+++ log2014.log 2012-12-07 18:01:54.000000000 +0800
10@@ -1,10 +1,12 @@
11 2013-01
12 2013-02
13-2013-03
14+2014-03
15 2013-04
16 2013-05
17 2013-06
18 2013-07
19-2013-08
20+2013-07
21 2013-09
22 2013-10
23+2013-11
24+2013-12[root@localhost test3]#
说明
实例七:打补丁
命令
xxxxxxxxxx
11patch log2013.log patch.log
输出
xxxxxxxxxx
261[root@localhost test3]# cat log2013.log
22013-01
32013-02
42013-03
52013-04
62013-05
72013-06
82013-07
92013-08
102013-09
112013-10[root@localhost test3]# patch log2013.log patch.log
12patching file log2013.log
13[root@localhost test3]#
14[root@localhost test3]# cat log2013.log
152013-01
162013-02
172014-03
182013-04
192013-05
202013-06
212013-07
222013-07
232013-09
242013-10
252013-11
262013-12[root@localhost test3]#
说明