patch
最后更新于:2022-04-02 03:52:18
[TOC]
## 语法
`patch [option] [origfile] [patchfile]`
```
option:
-E 若修补过后输出的文件其内容是一片空白,则移除该文件
-b 备份每一个原始文件。
-B | --prefix=<备份字首字符串> 设置文件备份时, 文件名称前面的字首字符串
-d<工作目录> 设置工作目录。
-l 忽略修补数据与输入数据的跳格,空格字符。
-p<剥离层级> 设置欲剥离几层路径名称。
-t 自动略过错误,不询问任何问题。
--verbose 详细显示指令的执行过程。
-R 在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)
```
### -p 参数说明
```
-p0 选项要从当前目录查找目的文件(夹)
-p1 选项要忽略掉第一层目录,从当前目录开始查找。
```
示例
```
--- old/modules/pcitable Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000
```
- -p0,那就表示从当前目录找一个叫做old的文件夹,在它下面寻找modules下的pcitable文件来执行patch操作。
- -p1, 那就表示忽略第一层目录,从当前目录寻找modules的文件夹,在它下面找pcitable。
### -b / -B / -z / -V 生成并修改备份文件名
**-b**
备份产生 ` .orig` 结果的备份文件
**-B**
`-b -B back_` 备份产生 ` back_xxx` 开头的备份文件
**-z**
`-b -z _back` 备份产生 ` xxx_back` 结尾的备份文件
**-V**
`-V t ` 产生 `xxx.~1~` 形式的文件
## 示例
### 升级单个文件
``` > diff -ruN test1 test2 > test.patch > cat testfile.patch /* --- test1 2020-09-22 22:52:40.000000000 +0800 +++ test2 2020-09-22 22:51:34.000000000 +0800 @@ -1,4 +1,4 @@ -111 222 +111 333 333 444 -555 666 +555 555 777 999 */ > patch patch -p0 < test.patch > cat test1 /* 111 222 333 444 555 666 777 999 */ // 回退版本 > patch -R -patch -p0 < test.patch ``` ### 批量升级
``` > diff -ruN diff1 diff2 > patch.log > cat patch.log > cd diff1 > path -E -p1 <../patch.log ``` > p1 忽略diff2 的目录 > -E 若生成的为空文件则删除 ### 批量升级并备份原始文件 在执行批量升级示例时候,添加 -b 参数即可 ``` > cd diff1 // 会产生 .orig 后缀的文件 > path -E -b -p1 <../patch.log ``` 若想指定备份文件的后缀,如下,会参数 _back 的后缀 ``` > path -E -b -z _back -p1 <../patch.log ``` ### 恢复旧版本目录 若上一个升级目录示例需要回退,则直接加 -R 参数即可 ``` // 可反复在添加 -R 与 取消 -R 切换备份还原 > cd diff1 > path -R -E -p1 <../patch.log ```
';
test1
``` 111 222 333 444 555 666 777 999 ```test2
``` 111 333 333 444 555 555 777 999 `````` > diff -ruN test1 test2 > test.patch > cat testfile.patch /* --- test1 2020-09-22 22:52:40.000000000 +0800 +++ test2 2020-09-22 22:51:34.000000000 +0800 @@ -1,4 +1,4 @@ -111 222 +111 333 333 444 -555 666 +555 555 777 999 */ > patch patch -p0 < test.patch > cat test1 /* 111 222 333 444 555 666 777 999 */ // 回退版本 > patch -R -patch -p0 < test.patch ``` ### 批量升级
diff1/test1
``` 111 222 333 444 555 666 777 999 ```diff1/testfile_1
``` HELLO LINUX! LINUX IS A FREE THIS IS A LINUX TESTFILE! LINUX TEST TEST IS A TEST ```diff2/test1
``` 111 333 333 444 555 555 777 999 ```diff2/testfile_1
``` HELLO WORLD! LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM. LINUX TEST THIS IS A ADD LINE `````` > diff -ruN diff1 diff2 > patch.log > cat patch.log > cd diff1 > path -E -p1 <../patch.log ``` > p1 忽略diff2 的目录 > -E 若生成的为空文件则删除 ### 批量升级并备份原始文件 在执行批量升级示例时候,添加 -b 参数即可 ``` > cd diff1 // 会产生 .orig 后缀的文件 > path -E -b -p1 <../patch.log ``` 若想指定备份文件的后缀,如下,会参数 _back 的后缀 ``` > path -E -b -z _back -p1 <../patch.log ``` ### 恢复旧版本目录 若上一个升级目录示例需要回退,则直接加 -R 参数即可 ``` // 可反复在添加 -R 与 取消 -R 切换备份还原 > cd diff1 > path -R -E -p1 <../patch.log ```