diff和patch更新补丁

文章目录

diff和patch更新补丁

  • diff用来对比文件差异和生成补丁文件
  • patch为旧版本打补丁

diff命令

命令 说明
diff -u 输出统一内容的头部信息(打补丁使用),计算机知道是哪个文件需要修改
diff -r 递归对比目录中的所有资源(可以对比目录)
diff -a 所有文件视为文本(包括二进制程序)
diff -N 无文件视为空文件
  • 说明-N作用
mkdir A 
mkdir B   #先创建两个空目录 A B
echo i am not full >  A/1.txt   #在A目录下创建1.txt
diff A B #对比A B目录
only in A: 1.txt     #警告只有A目录下有1.txt 无法比较

diff -N A B #加上N参数    将无文件视为空文件
diff -u -N A/1.txt B/1.txt
--- A/1.txt     2021-01-12 11:16:25.467376174 -0500
+++ B/1.txt     1969-12-31 19:00:00.000000000 -0500
@@ -1 +0,0 @@
-i am not full

#加上N 就能比较了    因为有和无文件无法比较   只能有和空文件比较  大概这个意思

diff测试

vim test1.sh
=================
#!/bin/bash
echo "i am v1 version"
=======================

vim test2.sh
======================
#!/bin/bash
echo "I am the second version"
================================= 
#准备两个不同的文件

diff test1.sh test2.sh #查看文件差异
2c2
< echo "i am v1 version"
---
> echo "I'm the second verison"

diff -u test1.sh test2.sh #查看差异 包含头部信息
--- test1.sh    2021-01-12 10:39:12.837272903 -0500
+++ test2.sh    2021-01-12 10:39:41.782274242 -0500
@@ -1,2 +1,2 @@
 #!/bin/bash
-echo "i am v1 version"
+echo "I'm the second verison"

#diff告诉怎么从第一个文件修改成第二个文件  不需要全部替换

diff -u test1.sh test2.sh > test1-2.patch   #生成test1.sh升级成test2.sh的补丁
cat test1-2.patch   #查看下里面是什么东西
--- test1.sh    2021-01-12 10:39:12.837272903 -0500
+++ test2.sh    2021-01-12 10:39:41.782274242 -0500
@@ -1,2 +1,2 @@
 #!/bin/bash
-echo "i am v1 version"
+echo "I'm the second verison"
#。。。。。好像就是diff -u 输出的东西。。。。 我自己重定向进行的。。。。

patch打补丁

patch 命令

参数 说明
patch -pnum -pnum(num为0~n数字,指定删除补丁文件中多少层路径前缀) 剥离层级数
patch -R 反向修复
patch -E 修复后如果文件为空,则删除该文件
patch -a 对比所有文件 不单单对比文本文件了 包括二进制文件
patch -r 递归对比
  • patch -pnum参数说明

比较难理解的参数 首先写该参数的数字时(就是-pnum的num) 需要判断两个参数 分别是当前路径和patch补丁文件里面的路径名

patch命令执行根据是.patch文件里面的路径名去找对应文件进行修改,所以需要人为的用-pnum来层级剥离路径来对应想要打补丁的旧文件和当前路径的关系

举个例子

当前路径为/root/demo/

旧文件是/root/demo/old.txt

补丁文件是/root/old.patch 补丁文件里面的路径为/root/pro/test/old.txt

所以你在/root/demo执行patch命令 那么就需要剥离4层 剥离/root/pro/test/ 得到old.txt 所以patch命令就能找到当前目录下的old.txt文件了

最终执行命令为patch -p4 < …/old.patch

yum -y install patch 
patch -p0 < test1-2.patch  #根据补丁升级
patching file test1.sh    #test1.sh被更新了

cat test1.sh  #查看下
#!/bin/bash
echo "I'm the second verison"  #升级变成test2.sh的内容了

patch -RE < test1-0.patch  #还原旧版本,反向修复
patching file test1.sh

cat test1.sh #查看下
#!/bin/bash
echo "i am v1 version"

目录补丁

案例测试

mkdir demo  #创建实验目录
cd demo
mkdir source{1,2}    #创建两个不同的目录

echo "hello world" > source1/test.sh  
cp /bin/find source1/     
tree source1/
source1
├── find
└── test.sh

echo "hello the world" > source2/test.sh
echo "test" > source2/tmp.txt
cp /bin/find source2/
echo "1" >> source2/find
tree source2
source2
├── find
├── test.sh
└── tmp.txt
#source1 source2 都有find和test.sh文件 但是内容不同  source2额外有tmp.txt


diff -u source1/ source2/
Binary files source1/find and source2/find differ    #没有对比find二进制文件
diff -u source1/test.sh source2/test.sh               #对比了test.sh
--- source1/test.sh     2021-01-12 11:45:20.005456405 -0500
+++ source2/test.sh     2021-01-12 11:47:55.275463587 -0500
@@ -1 +1 @@
-hello world
+hello the world
Only in source2/: tmp.txt                  #tmp.txt没有对应文件对比
#总结  仅仅对比了文本文件test.sh  二进制文件 tmp 都没有对比
#-a解决二进制文件find    -N解决tmp.txt文件

diff -Nuar source1/ source2/ > source.patch  #生成目录source1到目录source2的补丁

cd source1
patch -p1 < ../source.patch       #当前在/root/demo/source1  所以执行patch -p1   将source1/test.sh前面的source1/这段去掉  就可以在当前目录下找到test.sh进行更新了     说白了就是路径问题 怎么讲patch补丁文件中的原本路径对应到当前路径去执行文件的修改操作
上一篇:分布式监控系统Zabbix-图形集中展示插件Graphtree安装笔记


下一篇:Linux kernel patch提交