Linux常用命令-diff

命令

diff

描述

compare files line by line
比较两个文件

用法

1
diff [OPTION]... FILES

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Options:
-q 如果两个文件内容不同,则显示不同结果differ,但不显示详情
-s 如果两个文件内容相同,则显示相同结果identical,但不显示详情,推荐和-q选项合并使用
-y 并列显示两个文件内容,并标记不同的行
-W 配合-y使用,指定并列显示的宽度,默认为130
--left-column 配合-y使用,相同的行只在左侧显示
--suppress-common-lines 配合-y使用,只显示不同的行
-u 显示统一diff格式,用于生成补丁文件
-r 比较两个目录时,递归比较子目录
-i 忽略大小写
-E 忽略tab键
-Z 忽略行尾的空格
-b 忽略连续的空格
-w 忽略所有空格
-B 忽略空白行

注意

diff命令生成补丁文件的时候,两个文件的位置很重要,以第二个文件为准,如果两个文件颠倒的话,会生成反向补丁文件
patch命令会自动检查补丁文件,如果是反向文件会提示Reversed (or previously applied) patch detected!,输入y即可自动反向合并

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
$ more a
#!/bin/bash
a=3
echo aaa
echo $a
mkdir dir1
$ more b
#!/bin/sh
a=4
echo aaa
echo $a
mkdir dir2
mkdir -p dir/dir3
$ diff a b
1c1
< #!/bin/bash
---
> #!/bin/sh
3c3
< a=3
---
> a=4
7c7,8
< mkdir dir1
---
> mkdir dir2
> mkdir -p dir/dir3
# 推荐合并使用-sq选项,不管文件是否相同,均显示对比结果
$ diff -sq old new
Files old and new differ
$ cp old old1
$ diff -sq old old1
Files old and old1 are identical
$ diff -y -W 50 a b
#!/bin/bash | #!/bin/sh
a=3 | a=4
echo aaa echo aaa
echo $a echo $a
mkdir dir1 | mkdir dir2
> mkdir -p dir/dir3
$ diff -y -W 50 --left-column a b
#!/bin/bash | #!/bin/sh
a=3 | a=4
echo aaa (
echo $a (
mkdir dir1 | mkdir dir2
> mkdir -p dir/dir3
$ diff -y -W 50 --suppress-common-lines a b
#!/bin/bash | #!/bin/sh
a=3 | a=4
mkdir dir1 | mkdir dir2
> mkdir -p dir/dir3

# 通过补丁文件合并代码
$ more old
#!/bin/bash
# old
a=3
echo aaa
echo $a
mkdir dir1
$ more new
#!/bin/sh
# new
a=4
echo aaa
echo $a
mkdir dir2
mkdir -p dir/dir3
# 以new文件为准生成补丁文件,注意两个文件的排序很重要,以第二个文件为准
$ diff -u old new > new.diff
$ more new.diff
--- old 2021-01-22 16:29:32.332851863 +0800
+++ new 2021-01-22 16:26:54.598089038 +0800
@@ -1,6 +1,7 @@
-#!/bin/bash
-# old
-a=3
+#!/bin/sh
+# new
+a=4
echo aaa
echo $a
-mkdir dir1
+mkdir dir2
+mkdir -p dir/dir3
# patch命令需要手动yum安装,将补丁文件合并到old文件中,即和new文件内容保持一致
$ patch old < new.diff
patching file old
$ more old
#!/bin/sh
# new
a=4
echo aaa
echo $a
mkdir dir2
mkdir -p dir/dir3
$ diff old new

# 对比两个目录及目录中的文件
$ mkdir dir1 dir2
$ echo aa > dir1/aa
$ echo bb > dir2/bb
$ echo a1 > dir1/cc
$ echo b1 > dir2/cc
$ tree dir1 dir2
dir1
├── aa
└── cc
dir2
├── bb
└── cc
# 显示aa只在dir1中,bb只在dir2中,cc文件内容不一致
$ diff dir1 dir2
Only in dir1: aa
Only in dir2: bb
diff dir1/cc dir2/cc
1c1
< a1
---
> b1