diff和patch工具打补丁
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工具打补丁相关推荐
- [转] 用Diff和Patch工具维护源码
在Unix系统下,维护源码版本可以使用很多方法,其中最常用的当然是大名鼎鼎的CVS,但实际上,简单的版本维护工作并没有必要使用复杂的CVS等专门的版本维护工具,Unix标配中的diff和patch工具 ...
- diff和patch工具使用(转)
本文转自 http://blog.chinaunix.net/uid-22848040-id-1767554.html diff和patch是一对工具,在数学上来说,diff是对两个集合的差运算,pa ...
- linux生成目录间补丁,Linux文件比对工具,Linux diff的用法,Linux补丁制作,patch用法...
diff通常在于比对同个文件不同版本之间的差异,不同文件没意义,因为差异都会出来 用法 diff [-bBi] from-file to-file -b忽略一行当中多个空白符号的差异 例如about ...
- 补丁的制作和使用:diff和patch
原理 现在有一个文件file1,通过修改file1得到了文件file2,然后用diff工具比较file1和file2的差异,得到一个补丁文件file.patch,它记录了两个文件的不同之处,patch ...
- diff 与 patch 的使用
在 Linux 的日常使用中,我们经常需要修改一些配置文件,然而在软件升级以后,经常会面临配置更新后与原配置部分不兼容的问题(当然我们更多的可能是来制作软件升级的补丁).在这种情况下我们通常有两种选择 ...
- 代码打补丁的利器——diff和patch
一般来说,如果我们在研发过程中需要对代码进行修改,是不需要通过打补丁的方式的,因为我们可以直接改动文件即可.但是如果针对一款要上线的产品,我们总不能在研发的电脑上编译通过后直接发布到线上的.(转载请指 ...
- linux下diff、patch制作补丁
http://blog.csdn.net/goldfighter/article/details/6150309 学习资料的收集比较简单,方法一类似于这种初级问题网上资料非常丰富,google或者ba ...
- <Linux>使用quilt工具制作补丁(patch)文件
Linux使用quilt工具制作补丁文件 前言 一.安装quilt工具 二.一个需要被打补丁的文件 三.quilt new命令创建初始补丁文件 四.quilt add命令添加目标文件 五.修改目标文件 ...
- diff和patch 打补丁
在Linux环境下,有两个工具用来给project打补丁,即diff和patch diff diff具有比较功能.可以使用man命令查看其使用方法. NAME diff ...
- diff (制作补丁)和 patch(添加补丁) 的简介及简单使用
diff是Linux系统的一个很重要的工具程序,我们通常用diff对同一软件(或程序)的不同版本的文件进行对比查看.不过,你不要用diff去比较两个完全不相干的文件,因为那样是比不出结果来的. dif ...
最新文章
- 模拟宽度自适应的输入框
- 阿里打破自然语言理解世界纪录,AI常识推理水平正在逼近人类
- 零基础学Python(第九章 循环控制【break】与【continue】)
- 微软 Powertoys 推出新的实用程序,自定义键盘快捷管理
- mysql存储过程已发_MySQL存储过程问题_MySQL - end
- 嵌入式工作笔记0001---认识SoC
- 使用UrlRewriteFilter对url进行更替
- Slave_SQL_Running: No mysql同步故障解决方法
- 热烈庆贺:一个月,由70名升级为60名!
- 一维热传导问题与C++描述
- win10安装mysql-8.0.12-winx64解压版
- QTP网管自动化测试框架
- 机器学习预测股票涨跌
- 关于Nginx服务器的一些粗略认识
- Java入门基本数据类型(羊驼)
- GPU编程 CUDA C++ 数组归约的示例和解释
- 在金融科技的诸多技术领域,目前最引人瞩目的当属区块链
- Runtime.getRuntime.exec()执行linux脚本导致程序卡死问题
- excel切片器_大部分人都不知道Excel切片器还能这么用,建议收藏
- 2018阿里巴巴春招面试