diff用于比较两个文件或目录的差异之处,并可以生成补丁(patch)使用patch命令对其进行更新。
diff [选项] [原文件或目录] [修改过的文件或目录]
对比文件的主要选项:
-y 并列显示
-W # 显示宽度,与-y一起使用
-c 上下问显示
-u 合并格式显示
-i 忽略大小写
-b 忽略空格字符
-B 忽略空白行
-q --brief 只显示对比结果(相同或不相同)
-#(num) 显示差异行上下#行
对目录的主要选项:
-r 对比子目录中的文件
-N 若目录中没有文件则使用空文件对比查看
diff有4种显示格式:
- 普通格式 (缺省)
- 并列格式 (-y)
- 上下文格式 (-c)
- 合并格式 (-u)
下面将在实例中说明这几种格式的区别:
[root@localhost ~]# cat a
a
b
c
d
E
[root@localhost ~]# cat b
a
b
c
d
e
使用缺省的普通格式对比文件:
3,6c3,5 此段表示文件差异的行号(左为源文件)与发送的变化,c表示被修改过,d表示删除,a表示添加
<表示源文件的内容
>表示目标文件的内容
---为两个文件的分隔符
[root@localhost ~]# diff a b
3,6c3,5
< c
< d
< E
<
---
> c
> d
> e
输出表明a与b文件的3,5,6被修改过
这样看对比效果并不明显,可以试试并列对比,使用-y选项
并列显示效果:
| 表示被修改过的行
< 表示新增加的行
-W 用于显示两个文件的宽度,可省略
[root@localhost ~]# diff -y -W 50 a b
a a
b b
c | c
d | d
E | e
<
使用并列格式看起来舒服很多,还有更舒服的显示方式——基于上下文的显示格式(-c,context)
前两行显示两个文件的基本信息
! 表示该行被修改过
+ 表示该行是新添加的
- 表示该行被删除了
-C 0 基于上下文的格式,默认显示改行前后三行,使用-C 0表示只显示改动的行
注:-C 0 等于 -c -0
[root@localhost ~]# diff -C 0 a b
*** a 2017-12-19 03:05:51.699314704 -0800
--- b 2017-12-19 03:05:30.596297065 -0800
***************
*** 3,6 ****
! c
! d
! E
!
--- 3,5 ----
! c
! d
! e
基于上下文的对比模式,若文件太大会显示很多 无用的行,所以有了合并模式(-u):
前两行表示文件的简要信息
@@-3,4 +3,3 @@表示文件改动的位置
- 表示第一个文件,a
+ 表示第二个文件,b
[root@localhost ~]# diff -U 0 a b
--- a 2017-12-19 03:05:51.699314704 -0800
+++ b 2017-12-19 03:05:30.596297065 -0800
@@ -3,4 +3,3 @@
-c
- d
-E
-
+c
+d
+e
使用diff命令对比出来的差异可以重定向到文件中,作为一个补丁,使用patch同步文件。
patch [选项] <补丁>
-E 选项说明如果发生了空文件,那么就删除它
-R 取消打过的补丁
例如:
生成补丁:
[root@localhost ~]# diff -U 0 a b >diff.patch
打补丁:
[root@localhost ~]# patch a diff.patch 指定更改a文件
patching file a
或者
[root@localhost ~]# patch diff.patch
还原文件:
[root@localhost ~]# patch a diff.patch
patching file a
Reversed (or previously applied) patch detected! Assume -R? [n] y 是否保留原文件
转载于:https://blog.51cto.com/jying/2051643