diff 与 patch
diff命令
当前目录下有a b 两个文件,内容如下
[15:40:58 19B]> cat a
111
44
[15:41:00 19B]> cat b
333
111
444
diff a b的结果如下
[15:59:54 19B]> diff a b
0a1
> 333
2c3
< 44
---
> 444
解释:
显式的信息是为了:帮助a转变为b文件
0a1,表示在a个文件里的第0行后,*添加* b文件的第1行
> 333 是辅助显示 0a1 中b文件的第1行内容为333
2c3,表示将a的第2行,*改变成* b的第三行
< 44 是表a文件第2行内容为44
---
> 444 是表示b文件第3行内容为444
a append
c change
选项
常用选项:
-r 如果 a b是目录,则会递归对比a,b下每个文件
-N 在a b是目录的前提下,如果文件不存在,则用空文件进行对比
-u 改变输出格式,是为了配合patch命令使用时的输出格式
例子:
dir2目录下有b/bb/file文件,file内容为123,dir1是空目录
[16:26:31 tmp]> diff -rNu dir1 dir2
diff -rNu dir1/bb/bbb/file dir2/bb/bbb/file
--- dir1/bb/bbb/file 1970-01-01 08:00:00.000000000 +0800
+++ dir2/bb/bbb/file 2023-05-11 14:58:51.219741320 +0800
@@ -0,0 +1 @@
+123
通常会将输出定向到文件中 diff -rNu dir1 dir2 > test.patch
patch命令
通过diff生成的patch文件,可以直接将a 转换成b文件
- 单个文件打补丁
假设现在有a b 文件,内容和diff中的例子一样
[16:29:55 19B]> diff -u a b > my_patch
[16:30:47 19B]> cat my_patch
--- a 2023-05-11 16:29:50.895225922 +0800
+++ b 2023-05-11 10:34:57.263809225 +0800
@@ -1,2 +1,3 @@
+333
111
-44
+444
打补丁
[16:38:14 19B]> patch a < my_patch
patching file a
[16:38:24 19B]> cat a
333
111
444
- 工程打补丁
假设现在有dir1 dir2目录,内容和diff中的例子一样
[16:39:28 tmp]> diff -rNu dir1 dir2 > my_patch
[16:40:18 tmp]> cat my_patch
diff -rNu dir1/bb/bbb/file dir2/bb/bbb/file
--- dir1/bb/bbb/file 1970-01-01 08:00:00.000000000 +0800
+++ dir2/bb/bbb/file 2023-05-11 14:58:51.219741320 +0800
@@ -0,0 +1 @@
+123
打补丁
[16:43:51 tmp]> cd dir1
[16:44:01 dir1]> patch -p1 < ../my_patch
patching file bb/bbb/file
其中,-p1 表示跳过对比中的第1级目录
如果,不加 -p参数,则会不会创建b/bb目录,直接在dir1中添加file
如果,改-p1 为 -p0,则会在dir1目录下,创建dir1/bb/bbb/file,而不是预期的bb/bbb/file
如果 存在dir1中有而dir2中没有的文件,在其他目录下执行 patch -p0 < my_patch,并不会创建dir1中独有的文件,只会创建和修改,dir1中不同或缺少的文件