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~` 形式的文件 ## 示例 ### 升级单个文件
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 ```
';