diff和patch命令

-- TOC --

diff命令用来比较两个文本,或两个文件夹内容的不同,也可用来生成patch文件。patch命令就是打补丁。

diff

normal模式

diff命令的默认模式就是normal模式。

$ diff a.txt b.txt
2a3
> newline
$ diff b.txt a.txt
3d2
< newline

2a3:a.txt的第2行增加(a)一行,就与b.txt的第3行相同了;

3d2:删除(d)b.txt的第3行,就与a.txt相同了。

$ diff a.txt b.txt
3c3
< new haha
---
> newline
$ diff b.txt a.txt
3c3
< newline
---
> new haha

3c3:修改(c)第3行后才能相同。

比较文件夹:

$ diff a b
diff a/1.txt b/1.txt
1c1
< 1111
---
> 2222
Only in a: 2.txt

context模式

context显示的差异,比normal模式更适合人类阅读。需要使用 -c 参数。

$ diff -c a.txt b.txt
*** a.txt       2021-11-02 16:38:36.604407939 +0800
--- b.txt       2021-11-02 16:28:35.159440683 +0800
***************
*** 1,3 ****
  123
  abc
! new haha
--- 1,3 ----
  123
  abc
! newline

context模式下,比较文件夹:

$ diff -c a b
diff -c a/1.txt b/1.txt
*** a/1.txt     2021-11-02 16:40:46.206400883 +0800
--- b/1.txt     2021-11-02 16:40:54.813400415 +0800
***************
*** 1 ****
! 1111
--- 1 ----
! 2222
Only in a: 2.txt

unified模式

在context模式的基础上,简化了输出,需要使用 -u 参数:

$ diff -u a.txt b.txt
--- a.txt       2021-11-02 16:38:36.604407939 +0800
+++ b.txt       2021-11-02 16:28:35.159440683 +0800
@@ -1,3 +1,3 @@
 123
 abc
-new haha
+newline

减少了一些行的输出。比较文件夹:

$ diff -u a b
diff -u a/1.txt b/1.txt
--- a/1.txt     2021-11-02 16:40:46.206400883 +0800
+++ b/1.txt     2021-11-02 16:40:54.813400415 +0800
@@ -1 +1 @@
-1111
+2222
Only in a: 2.txt

-N

在比较两个文件夹的时候,常常会出现某些文件只存在一个文件夹中,此时加上 -N 参数,对比的时候,不存在的文件,就会以空文件的方式参与比较,在制作patch文件的时候,基本上必须要加上这个参数!

$ diff -N a b
diff -N a/1.txt b/1.txt
1c1
< 1111
---
> 2222
diff -N a/2.txt b/2.txt
1d0
< im 2..
$ diff -Nc a b
diff -Nc a/1.txt b/1.txt
*** a/1.txt     2021-11-02 16:40:46.206400883 +0800
--- b/1.txt     2021-11-02 16:40:54.813400415 +0800
***************
*** 1 ****
! 1111
--- 1 ----
! 2222
diff -Nc a/2.txt b/2.txt
*** a/2.txt     2021-11-02 16:50:56.805367641 +0800
--- b/2.txt     1970-01-01 08:00:00.000000000 +0800
***************
*** 1 ****
- im 2..
--- 0 ----
$ diff -Nu a b
diff -Nu a/1.txt b/1.txt
--- a/1.txt     2021-11-02 16:40:46.206400883 +0800
+++ b/1.txt     2021-11-02 16:40:54.813400415 +0800
@@ -1 +1 @@
-1111
+2222
diff -Nu a/2.txt b/2.txt
--- a/2.txt     2021-11-02 16:50:56.805367641 +0800
+++ b/2.txt     1970-01-01 08:00:00.000000000 +0800
@@ -1 +0,0 @@
-im 2..

-r

recursive,递归深入所有子目录。

-p

显示代码所有在C函数信息。

-a

treat all files as text

生成patch文件

其实patch文件,就是diff命令的输出,将diff命令的输出重定向为一个patch文件,这就是patch文件的制作方法。

不知为何,我看到的patch文件,全部都是用 -u 的diff模式生成的。一般都是 -urpN 这几个参数一起用。

patch

所谓打补丁,其实就是应用patch文件,将变更同步到文件当中去。

如果patch文件是针对某单个文件的,应用这个补丁的方法:

$ patch <origin_file> <patch>

但更多的时候,patch文件内包含了整个项目的所有变更过的文件的内容变化,此时就要采用另一种方式来apply patch:

$ patch -pN < <patch>

N表示要去掉的目录的层数,如果patch文件与项目顶层目录并列,应该就是-p0。如果不确定N这个数值是否正确,可以用--dry-run测试!

使用patch文件的好处是,文件小传输快,而且一眼就能看出修改了写什么。

本文链接:https://cs.pynote.net/sf/linux/shell/202111026/

-- EOF --

-- MORE --