diff和patch工具打补丁

  • 1 对比单个文件差异
    • 1.1 编写两个版本的脚本,一个为v1版本,一个为v2版本。
    • 2.2 使用diff命令语法
  • 2 使用patch命令对单文件代码打补丁
    • 2.1 生成补丁文件
    • 2.2 使用patch命令打补丁
  • 3 对比目录中所有文件的差异
    • 3.1 准备实验环境
    • 3.2 对比差异
  • 4 patch命令对目录下的所有代码打补丁
    • 4.1 前面创建的source1和source2目录下的代码为素材,生成补丁文件
    • 4.2 使用patch命令为代码打补丁

1 对比单个文件差异

1.1 编写两个版本的脚本,一个为v1版本,一个为v2版本。

vim test1.sh                         #v1版本脚本
#!/bin/bash
echo "hello wrld"
vim test2.sh                         #v2版本脚本#!/bin/bash
echo "hello the world"
echo "test file"

2.2 使用diff命令语法

使用diff命令查看不同版本文件的差异。

diff  test1.sh test2.sh                     #查看文件差异2c2,3
< echo "hello wrld"
---
> echo "hello the world"
> echo "test file"diff -u test1.sh test2.sh                #查看差异,包含头部信息--- test1.sh    2020-08-13 14:59:39.161420021 +0800
+++ test2.sh    2020-08-13 14:59:57.121420407 +0800
@@ -1,2 +1,3 @@#!/bin/bash
-echo "hello wrld"
+echo "hello the world"
+echo "test file"

diff制作补丁文件的原理:告诉我们怎么修改第一个文件后能得到第二个文件。

这样如果第一个版本的脚本有漏洞,我们不需要将整个脚本都替换,仅需要修改有问题的一小部分代码即可,diff刚好可以满足这个需求!

像Linux内核这样的大块头,一旦发现有一个小漏洞,我们不可能把整个内核都重新下载,全部替换一遍,而仅需要更新有问题的那一小部分代码即可!

  • diff 命令常用选项:

    • -u 输出统一内容的头部信息(打补丁使用),计算机知道是哪个文件需要修改

    • -r 递归对比目录中的所有资源(可以对比目录)

    • -a 所有文件视为文本(包括二进制程序)

    • -N 无文件视为空文件(空文件怎么变成第二个文件)

      • -N选项备注说明:
      • A目录下没有txt文件,B目录下有txt文件
      • diff比较两个目录时,默认会提示txt仅在B目录有(无法对比差异,修复文件)
      • diff比较时使用N选项,则diff会拿B下的txt与A下的空文件对比,补丁信息会明确说明如何从空文件修改后变成txt文件,打补丁即可成功!

2 使用patch命令对单文件代码打补丁

2.1 生成补丁文件

diff -u test1.sh test2.sh > test.patch

2.2 使用patch命令打补丁

在代码相同目录下为代码打补丁

yum -y install patch
patch -p0 < test.patch                    #打补丁
patching file test1.sh
#patch -pnum(其中num为数字,指定删除补丁文件中多少层路径前缀)
#如原始路径为/u/howard/src/blurfl/blurfl.c
#-p0则整个路径不变
#-p1则修改路径为u/howard/src/blurfl/blurfl.c
#-p4则修改路径为blurfl/blurfl.c
#-R(reverse)反向修复,-E修复后如果文件为空,则删除该文件cat test1.sh
#!/bin/bash
echo "hello the world"
echo "test file"patch -RE < test.patch                     #还原旧版本,反向修复
cat test1.sh
#!/bin/bash
echo "hello wrld"

3 对比目录中所有文件的差异

3.1 准备实验环境

mkdir demo
cd demo
mkdir {source1,source2}
echo "hello world"       > source1/test.sh
cp /bin/find source1/
tree source1/                        #source1目录下2个文件source1/
├── find
└── test.sh0 directories, 2 files[root@proxy demo]# echo "hello the world"  > source2/test.sh
[root@proxy demo]# echo "test" > source2/tmp.txt
[root@proxy demo]# cp /bin/find source2/
[root@proxy demo]# echo "1" >> source2/find
[root@proxy demo]#  tree source2/                        #source1目录下3个文件
source2/
├── find
├── test.sh
└── tmp.txt0 directories, 3 files#注意:两个目录下find和test.sh文件内容不同,source2有tmp.txt而source1没有该文件

3.2 对比差异

diff -u source1/ source2/
#仅对比了文本文件test.sh;二进制文件、tmp都没有对比差异,仅提示,因为没有-a和-N选项
Binary files source1/find and source2/find differ
diff -u source1/test.sh source2/test.sh
--- source1/test.sh     2020-08-13 15:12:51.233437049 +0800
+++ source2/test.sh     2020-08-13 15:14:20.849438976 +0800
@@ -1 +1 @@
-hello world
+hello the world
只在 source2/ 存在:tmp.txtdiff -Nu source1/ source2/
#对比了test.sh,并且使用source2目录的tmp.txt与source1的空文件对比差异。
Binary files source1/find and source2/find differ
diff -Nu source1/test.sh source2/test.sh
--- source1/test.sh     2020-08-13 15:12:51.233437049 +0800
+++ source2/test.sh     2020-08-13 15:14:20.849438976 +0800
@@ -1 +1 @@
-hello world
+hello the world
diff -Nu source1/tmp.txt source2/tmp.txt
--- source1/tmp.txt     1970-01-01 08:00:00.000000000 +0800
+++ source2/tmp.txt     2020-08-13 15:14:25.569439078 +0800
@@ -0,0 +1 @@
+testdiff -Nua source1/ source2/
#对比了test.sh、tmp.txt、find(程序)。

4 patch命令对目录下的所有代码打补丁

4.1 前面创建的source1和source2目录下的代码为素材,生成补丁文件

diff -Nuar source1/ source2/ > source.patch

4.2 使用patch命令为代码打补丁

ls
source1  source2  source.patchcat source.patch                #对比的文件有路径信息cd source1
patch  -p1 < ../source.patch


diff和patch工具打补丁相关推荐

  1. [转] 用Diff和Patch工具维护源码

    在Unix系统下,维护源码版本可以使用很多方法,其中最常用的当然是大名鼎鼎的CVS,但实际上,简单的版本维护工作并没有必要使用复杂的CVS等专门的版本维护工具,Unix标配中的diff和patch工具 ...

  2. diff和patch工具使用(转)

    本文转自 http://blog.chinaunix.net/uid-22848040-id-1767554.html diff和patch是一对工具,在数学上来说,diff是对两个集合的差运算,pa ...

  3. linux生成目录间补丁,Linux文件比对工具,Linux diff的用法,Linux补丁制作,patch用法...

    diff通常在于比对同个文件不同版本之间的差异,不同文件没意义,因为差异都会出来 用法 diff [-bBi] from-file to-file -b忽略一行当中多个空白符号的差异 例如about ...

  4. 补丁的制作和使用:diff和patch

    原理 现在有一个文件file1,通过修改file1得到了文件file2,然后用diff工具比较file1和file2的差异,得到一个补丁文件file.patch,它记录了两个文件的不同之处,patch ...

  5. diff 与 patch 的使用

    在 Linux 的日常使用中,我们经常需要修改一些配置文件,然而在软件升级以后,经常会面临配置更新后与原配置部分不兼容的问题(当然我们更多的可能是来制作软件升级的补丁).在这种情况下我们通常有两种选择 ...

  6. 代码打补丁的利器——diff和patch

    一般来说,如果我们在研发过程中需要对代码进行修改,是不需要通过打补丁的方式的,因为我们可以直接改动文件即可.但是如果针对一款要上线的产品,我们总不能在研发的电脑上编译通过后直接发布到线上的.(转载请指 ...

  7. linux下diff、patch制作补丁

    http://blog.csdn.net/goldfighter/article/details/6150309 学习资料的收集比较简单,方法一类似于这种初级问题网上资料非常丰富,google或者ba ...

  8. <Linux>使用quilt工具制作补丁(patch)文件

    Linux使用quilt工具制作补丁文件 前言 一.安装quilt工具 二.一个需要被打补丁的文件 三.quilt new命令创建初始补丁文件 四.quilt add命令添加目标文件 五.修改目标文件 ...

  9. diff和patch 打补丁

    在Linux环境下,有两个工具用来给project打补丁,即diff和patch diff          diff具有比较功能.可以使用man命令查看其使用方法. NAME        diff ...

  10. diff (制作补丁)和 patch(添加补丁) 的简介及简单使用

    diff是Linux系统的一个很重要的工具程序,我们通常用diff对同一软件(或程序)的不同版本的文件进行对比查看.不过,你不要用diff去比较两个完全不相干的文件,因为那样是比不出结果来的. dif ...

最新文章

  1. 模拟宽度自适应的输入框
  2. 阿里打破自然语言理解世界纪录,AI常识推理水平正在逼近人类
  3. 零基础学Python(第九章 循环控制【break】与【continue】)
  4. 微软 Powertoys 推出新的实用程序,自定义键盘快捷管理
  5. mysql存储过程已发_MySQL存储过程问题_MySQL - end
  6. 嵌入式工作笔记0001---认识SoC
  7. 使用UrlRewriteFilter对url进行更替
  8. Slave_SQL_Running: No mysql同步故障解决方法
  9. 热烈庆贺:一个月,由70名升级为60名!
  10. 一维热传导问题与C++描述
  11. win10安装mysql-8.0.12-winx64解压版
  12. QTP网管自动化测试框架
  13. 机器学习预测股票涨跌
  14. 关于Nginx服务器的一些粗略认识
  15. Java入门基本数据类型(羊驼)
  16. GPU编程 CUDA C++ 数组归约的示例和解释
  17. 在金融科技的诸多技术领域,目前最引人瞩目的当属区块链
  18. Runtime.getRuntime.exec()执行linux脚本导致程序卡死问题
  19. excel切片器_大部分人都不知道Excel切片器还能这么用,建议收藏
  20. 2018阿里巴巴春招面试

热门文章

  1. java小写金额转大写金额_java转换小写金额为大写金额
  2. SMing:2022年中青杯A题思路
  3. 硬盘转速和平均寻道时间
  4. 区块链技术在银行业的应用
  5. n1盒子救砖_N1不能通过网络刷机后拆机救砖
  6. android 波斯文排序,android 阿拉伯,波斯字符串从右到左显示问题
  7. 接口文档要写在概要设计里吗_概要设计报告怎么写
  8. 成长就是不断升级自己的认知
  9. python 文件路径斜杠变成两道_Python文件操作---正斜杠与反斜杠
  10. win7添加java环境变量path_Win7怎么配置Java环境变量?