linux文件对比及打补丁diff、patch

2018-07-02 17:09:20

diff

-b :忽略一行当中,仅有多个空白的差异,"about   me" 与 "about me" 视为相同
-B :忽略空白行的差异。
-i :忽略大小写的不同。

-r:递归比较
-N:如果文件缺失,会类似新建空白文件然后比较
-u:以合并方式显示

假设 /tmp 目录下有new old 2个目录,old 里面只有a.txt文件。

[root@izj6cfw9yi1iqoik31tqbgz tmp]# diff -urN old new > 1.patch 
[root@izj6cfw9yi1iqoik31tqbgz tmp]# cat 1.patch
diff -urN old/aaa/c.txt new/aaa/c.txt
--- old/aaa/c.txt	1970-01-01 08:00:00.000000000 +0800
+++ new/aaa/c.txt	2018-07-02 16:20:05.049292893 +0800
@@ -0,0 +1 @@
+ccc
diff -urN old/a.txt new/a.txt
--- old/a.txt	2018-07-02 16:41:15.669798301 +0800
+++ new/a.txt	2018-07-02 16:05:11.229731683 +0800
@@ -1 +1,2 @@    #-1代表减去第1行,+1,2代表增加1-2行
-aaaa
+2222
+3333
diff -urN old/b.txt new/b.txt
--- old/b.txt	1970-01-01 08:00:00.000000000 +0800
+++ new/b.txt	2018-07-02 16:08:27.623556542 +0800
@@ -0,0 +1 @@
+i am new file


patch

利用上面diff我们已经得到了补丁文件 1.patch。打补丁的时候一定要跟里面的相对路径对上去。比如里面的相对路径为 old/b.txt new/b.txt,那么我们可以指定 p0 然后在 /tmp 目录里打补丁。

如果我们跳转到到 /tmp/old 里面去打补丁,此时由于跟里面的相对路径对不上,应该指定 p1,意思是去掉一层目录。

如果在 new 目录里面有新增文件(diff 时指定了 -N 参数),如果我们在 /tmp 目录里运行打补丁命令如下

patch -p0 < 1.patch

那么系统会利用 1.patch 删除 new 目录里的新文件,而本该在old里新增文件却不会新增,这样会乱套。

The next patch would create the file new/b.txt,
which already exists!  Assume -R? [n] y

实际开发中,一般在new里面开发完成后生成补丁,然后打到old目录中来同步成new中的内容,而new中的内容会保持不变。

所以为了避免乱套,我们最好跳转到 old 目录里面,然后再打补丁。

[root@izj6cfw9yi1iqoik31tqbgz tmp]# cd old
[root@izj6cfw9yi1iqoik31tqbgz old]# patch -p1 < ../1.patch


备注:
1.本系列命令都在centos7里测试,其他发行版如ubuntu、debian、fedora、opensuse等可能略微不同
2.本文只讲解常用用法,详细用法请自行利用 man 命令查看
3.原文地址http://www.freecls.com/a/2712/6b

 

©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。