linux下diff、patch制作补丁

Linux基础 - 使用 diff 和 patch 合并代码 Linux 命令行 合并代码 阅读详情

http://blog.youkuaiyun.com/goldfighter/article/details/6150309


学习资料的收集比较简单,方法一类似于这种初级问题网上资料非常丰富,google或者baidu搜索一下,然后选择有价值的资料,方法二是阅读man在线文档。完成收集工作,当然最终要在自己的Linux上作实验,比较总结,消化吸收为自己的东西。要除去这么一种错误思想:一定要学全。要知道,一次学全是不可能的,只能先学习最为常用的,在以后不断实践的过程中逐步的丰富,最终达到比较高的水平。把握的原则是:日有所学,学以致用,用以促学。

 

首先介绍一下diff和patch。在这里不会把man在线文档上所有的选项都介绍一下,那样也没有必要。在99%的时间里,我们只会用到几个选项。所以必须学会这几个选项。

 

1、diff

NAME

diff - find differences between two files

 

SYNOPSIS

diff [options] from-file to-file

 

简单的说,diff的功能就是用来比较两个文件的不同,然后记录下来,也就是所谓的diff补丁。语法格式:diff 【选项】 源文件(夹) 目的文件(夹),就是要给源文件(夹)打个补丁,使之变成目的文件(夹),术语也就是“升级”。下面介绍三个最为常用选项:

 

-r 是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。

 

-N 选项确保补丁文件将正确地处理已经创建或删除文件的情况。

 

-u 选项以统一格式创建补丁文件,这种格式比缺省格式更紧凑些。

 

2、patch

NAME

patch - apply a diff file to an original

 

SYNOPSIS

patch [options] [originalfile [patchfile]]

 

but usually just

patch -pnum

 

简单的说,patch就是利用diff制作的补丁来实现源文件(夹)和目的文件(夹)的转换。这样说就意味着你可以有源文件(夹)――>目的文件(夹),也可以目的文件(夹)――>源文件(夹)。下面介绍几个最常用选项:

 

-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,那就表示忽略第一层目录(即不管old),从当前目录寻找modules的文件夹,在它下面找pcitable。这样的前提是当前目录必须为modules所在的目录。而diff补丁文件则可以在任意位置,只要指明了diff补丁文件的路径就可以了。当然,可以用相对路径,也可以用绝对路径。不过我一般习惯用相对路径。

 

-E 选项说明如果发现了空文件,那么就删除它

 

-R 选项说明在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)

 

下面结合具体实例来分析和解决,分为两种类型:为单个文件打补丁和为文件夹内的多个文件打补丁。

 

环境:在RedHat 9.0下面以armlinux用户登陆。

目录树如下:

|-- bootloader

|-- debug

|-- images

|-- kernel

|-- program

|-- rootfiles

|-- software

|-- source

|-- sysapps

|-- tmp

`-- tools

下面在program文件夹下面建立patch文件夹作为实验用,然后进入patch文件夹。

 

一、为单个文件进行补丁操作

 

1、建立测试文件test0、test1

 

[armlinux@lqm patch]$ cat >>test0<

> 111111

> 111111

> 111111

> EOF

[armlinux@lqm patch]$ more test0

111111

111111

111111

[armlinux@lqm patch]$ cat >>test1<

> 222222

> 111111

> 222222

> 111111

> EOF

[armlinux@lqm patch]$ more test1

222222

111111

222222

111111

 

2、使用diff创建补丁test1.patch

[armlinux@lqm patch]$ diff -uN test0 test1 > test1.patch

【注:因为单个文件,所以不需要-r选项。选项顺序没有关系,即可以是-uN,也可以是-Nu。】

[armlinux@lqm patch]$ ls

test0 test1 test1.patch

 

patch文件的结构

补丁头

补丁头是分别由---/+++开头的两行,用来表示要打补丁的文件。---开头表示旧文件,+++开头表示新文件。

一个补丁文件中的多个补丁

一个补丁文件中可能包含以---/+++开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁。

块

块是补丁中要修改的地方。它通常由一部分不用修改的东西开始和结束。他们只是用来表示要修改的位置。他们通常以@@开始,结束于另一个块的开始或者一个新的补丁头。

块的缩进

块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。

块的第一列

+号表示这一行是要加上的。

-号表示这一行是要删除的。

没有加号也没有减号表示这里只是引用的而不需要修改。

[armlinux@lqm patch]$ patch -p0 < test1.patch

patching file test0

[armlinux@lqm patch]$ ls

test0 test1 test1.patch

[armlinux@lqm patch]$ cat test0

222222

111111

222222

111111

 

3、可以去除补丁,恢复旧版本

[armlinux@lqm patch]$ patch -RE -p0 < test1.patch

patching file test0

[armlinux@lqm patch]$ ls

test0 test1 test1.patch

[armlinux@lqm patch]$ cat test0

111111

111111

111111

 

二、为多个文件进行补丁操作

 

1、创建测试文件夹

[armlinux@lqm patch]$ mkdir prj0

[armlinux@lqm patch]$ cp test0 prj0

[armlinux@lqm patch]$ ls

prj0 test0 test1 test1.patch

[armlinux@lqm patch]$ cd prj0/

[armlinux@lqm prj0]$ ls

test0

[armlinux@lqm prj0]$ cat >>prj0name<

> --------

> prj0/prj0name

> --------

> EOF

[armlinux@lqm prj0]$ ls

prj0name test0

[armlinux@lqm prj0]$ cat prj0name

--------

prj0/prj0name

--------

[armlinux@lqm prj0]$ cd ..

[armlinux@lqm patch]$ mkdir prj1

[armlinux@lqm patch]$ cp test1 prj1

[armlinux@lqm patch]$ cd prj1

[armlinux@lqm prj1]$ cat >>prj1name<

> ---------

> prj1/prj1name

> ---------

> EOF

[armlinux@lqm prj1]$ cat prj1name

---------

prj1/prj1name

---------

[armlinux@lqm prj1]$ cd ..

 

2、创建补丁

[armlinux@lqm patch]$ diff -uNr prj0 prj1 > prj1.patch

 [armlinux@lqm patch]$ ls

prj0 prj1 prj1.patch test0 test1 test1.patch

[armlinux@lqm patch]$ cp prj1.patch ./prj0

[armlinux@lqm patch]$ cd prj0

[armlinux@lqm prj0]$ patch -p1 < prj1.patch

patching file prj0name

patching file prj1name

patching file test0

patching file test1

[armlinux@lqm prj0]$ ls

prj1name prj1.patch test1

[armlinux@lqm prj0]$ patch -R -p1 < prj1.patch

patching file prj0name

patching file prj1name

patching file test0

patching file test1

[armlinux@lqm prj0]$ ls

prj0name prj1.patch test0

-------------------

 

总结一下:

单个文件

diff –uN from-file to-file >to-file.patch

patch –p0 < to-file.patch

patch –RE –p0 < to-file.patch

 

多个文件

diff –uNr from-docu to-docu >to-docu.patch

patch –p1 < to-docu.patch

patch –R –p1

-------------------

 

三、应用

 

为内核打补丁。

1、首先是解压,因为发布的补丁文件都是使用gzip压缩的。

$gunzip ../setup-dir/ patch-2.4.21-rmk1.gz

 

2、然后进入你的内核源代码目录

$cd linux-2.4.21

 

3、打补丁

$patch –p1 < ../../setup-dir/patch-2.4.21-rmk1

 

打完补丁后,需要检查一下有没有拒绝执行的文件,即检查.rej文件的存在。使用命令:

$find . -name *.rej

如果发现,会将其输出到标准输出终端,默认屏幕。当然,你也可以采用重定向,输出到指定文件,比如reject。

$fine . -name *.rej >reject

然后可以查看reject的内容了。

 

diff和patch使用指南

diff和patch是一对工具,在数学上来说,diff是对两个集合的差运算,patch是对两个集合的和运算。

diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的patch文件,即补丁文件。

patch能将diff文件运用于原来的两个集合之一,从而得到另一个集合。举个例子来说文件A和文件B,经过diff之后生成了补丁文件C,那么着个过程相当于 A -B = C ,那么patch的过程就是B+C = A 或A-C =B。

因此我们只要能得到A, B, C三个文件中的任何两个,就能用diff和patch这对工具生成另外一个文件。

 

这就是diff和patch的妙处。下面分别介绍一下两个工具的用法:

 

1. diff的用法

 

diff后面可以接两个文件名或两个目录名。如果是一个目录名加一个文件名,那么只作用在那么个目录下的同名文件。

 

如果是两个目录的话,作用于该目录下的所有文件,不递归。如果我们希望递归执行,需要使用-r参数。

 

命令diff A B > C ,一般A是原始文件,B是修改后的文件,C称为A的补丁文件。

不加任何参数生成的diff文件格式是一种简单的格式,这种格式只标出了不一样的行数和内容。我们需要一种更详细的格式,可以标识出不同之处的上下文环境,这样更有利于提高patch命令的识别能力。这个时候可以用-c开关。

 

2. patch的用法

 

patch用于根据原文件和补丁文件生成目标文件。还是拿上个例子来说,patch A C 就能得到B, 这一步叫做对A打上了B的名字为C的补丁。

 

这一步之后,你的文件A就变成了文件B。如果你打完补丁之后想恢复到A怎么办呢?

 

patch -R B C 就可以重新还原到A了。

 

所以不用担心会失去A的问题。

 

其实patch在具体使用的时候是不用指定原文件的,因为补丁文件中都已经记载了原文件的路径和名称。patch足够聪明可以认出来。但是有时候会有点小问题。比如一般对两个目录diff的时候可能已经包含了原目录的名字,但是我们打补丁的时候会进入到目录中再使用patch,着个时候就需要你告诉 patch命令怎么处理补丁文件中的路径。可以利用-pn开关,告诉patch命令忽略的路径分隔符的个数。举例如下:

 

A文件在 DIR_A下,修改后的B文件在DIR_B下,一般DIR_A和DIR_B在同一级目录。我们为了对整个目录下的所有文件一次性diff,我们一般会到DIR_A和DIR_B的父目录下执行以下命令

 

diff -rc DIR_A DIR_B > C

 

这个时候补丁文件C中会记录了原始文件的路径为 DIR_A/A

 

现在另一个用户得到了A文件和C文件,其中A文件所在的目录也是DIR_A。一般,他会比较喜欢在DIR_A目录下面进行patch操作,它会执行

 

patch < C

 

但是这个时候patch分析C文件中的记录,认为原始文件是./DIR_A/A,但实际上是./A,此时patch会找不到原始文件。为了避免这种情况我们可以使用-p1参数如下

 

patch -p1 < C

 

此时,patch会忽略掉第1个”/”之前的内容,认为原始文件是 ./A,这样就正确了。

 

最后有以下几点注意:

 

1. 一次打多个patch的话,一般这些patch有先后顺序,得按次序打才行。

2. 在patch之前不要对原文件进行任何修改

3. 如果patch中记录的原始文件和你得到的原始文件版本不匹配(很容易出现),那么你可以尝试使用patch, 如果幸运的话,可以成功。大部分情况下,会有不匹配的情况,此时patch会生成rej文件,记录失败的地方,你可以手工修改。


告别龟速与断连:Arduino IDE下ESP32及ESP32-CAM一站式环境部署指南 本文提供Arduino IDE下ESP32及ESP32-CAM一站式环境部署指南,解决下载速度慢、断连等常见问题。通过国内镜像源加速、详细步骤讲解和ESP32-CAM专属配置技巧,帮助开发者快速完成环境搭建,避免常见陷阱,提升开发效率。 阅读详情

相关推荐

QKD(量子密钥分发)

量子密钥分发(Quantum Key Distribution,QKD)是一种基于量子力学原理的安全通信协议,它允许两个用户通过不安全的通信信道创建并共享一个安全的密钥。这个密钥随后可以用于加密和解密信息,确保通信的机密性。QKD的核心原理是量子不可克隆定理和量子测量的不确定性。

qq_40844444的博客 2896

linux下patch命令使用详解---linux打补丁命令

功能说明:修补文件。 语  法:patch [-bceEflnNRstTuvZ][-B ][-d ][-D ][-F ][-g ][-i ][-o ][-p ][-r ][-V ][-Y ][-z ][--backup-if   -mismatch][--binary][--help][--nobackup-if-mismatch][--verbose][原始文件 ] 或 path [-p

qq160816的专栏 5125

告别第三方工具!用Windows自带蓝牙玩转BLE设备调试(保姆级图文教程)

本文详细介绍了如何利用Windows自带的蓝牙功能进行BLE设备调试,无需第三方工具。从硬件准备、系统配置到实战操作,提供保姆级图文教程,帮助开发者高效完成设备发现、数据交互等全流程调试工作。特别适合物联网开发者和智能硬件爱好者。

o5p6q的博客 733

linux中如何打补丁?

所以,打补丁时,要进入你的 Linux 源码根目录,并且告诉 patch 工具,请忽略补丁中的路径的第一级目录。路径信息包含了你的 Linux 源码根目录的名称,但其他人的源码根目录可能是其它名字,1、patch -RE < test.patch 取消 patch 对源文件的修改。不使用 p 参数的时候,patch 命令会 忽略 任何目录,直接使用文件。2、patch -p1 < test.patch 表示跳过几级目录。1 标识去掉第一层目录,从当前目录查找;patch -p 后面是不能带负数 的。

qq_52265298的博客 3590

论文阅读—Square Attack: a query-efficient black-box adversarial attack via random search

论文阅读—Square Attack: a query-efficient black-box adversarial attack via random search 发表位置 ECCV 2020 摘要 作者提出了一种基于得分的黑盒Square attack,该模型不依赖于模型的局部梯度信息,因此可以绕过梯度隐藏防御攻击。Square Attack是一种随机搜索方法,它在随机位置选择局部的方形更新,使得每次迭代时扰动近似位于可行集的边界。 背景 当涉及到对安全至关重要的机器学习应用时,对抗性的例子尤其值得

yayayamaomaoya的博客 2494

解决Todesk连接卡在100%问题:remote display server is not supported (e.g. Wayland)

摘要:解决Ubuntu 22.04远程桌面连接问题(AnyDesk报错"remote display server not supported"及向日葵/Todesk无法显示)。方法:1)安装lightdm显示管理器;2)启用lightdm并禁用gdm;3)编辑/etc/gdm3/custom.conf文件,添加WaylandEnable=false;4)重启系统。注:后续可通过命令切换回gdm显示管理器。该方法适用于解决Wayland显示协议导致的远程桌面连接兼容性问题。

猿小白的博客 1573

linux下生成补丁、打补丁

要在两个目录中生成补丁文件并打补丁,可以使用 diff 和 patch 命令,特别是在有多个文件和子目录的情况下。使用 diff 命令生成目录之间的补丁文件。diff 命令用于比较两个文件的差异,并以不同的格式输出结果。选项启用,是目前最常用的格式,因为它简洁且易于阅读,常用于版本控制系统。以下是一个完整的示例,包括创建原始文件、修改文件、生成补丁和应用补丁。以下是一个完整的示例,包括创建原始文件、修改文件、生成补丁和应用补丁。选项启用,它会显示差异的上下文信息,帮助用户更好地理解差异的位置。

weixin_53920303的博客 3569

【导航理论&实战篇】四足机器人弹簧倒立摆(SLIP)动力学模型

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对四足机器人动力学模型-VMC、SLIP和浮动机体模型做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章四足机器人弹簧加载倒立摆(SLIP)动力学模型是一种用于描述和分析四足机器人在运动过程中动态特性的理论模型。这种模型将四足机器人的腿部简化为弹簧,而机器人的身体则被视为一个倒立摆,这样的抽象使得研究者能够更容易地分析和控制机器人的运动。提示:以下是本篇文章正文内容。

qq_35635374的博客 806

Linux下使用diff和patch制作及打补丁(已经实践可行!)

转自:https://blog.youkuaiyun.com/tao_627/article/details/52939175 在做开发的过程中难免需要给内核及下载的一些源码打补丁,所以我们先学习下Linux下使用如如何使用diff制作补丁以及如何使用patch打补丁。 通过diff命令比较出新旧版本之间的差异,并以patch命令来将旧版本更新为新版本。 首先介绍一下diff和patch。 1、dif...

zzwdkxx的专栏 4869

工业-实时数据采集

在主节点使用Flume采集/data_log目录下实时日志文件中的数据,将数据存入到Kafka的Topic 中(Topic名称分别为ChangeRecord、ProduceRecord和EnvironmentData,分区数为4),Flume 采集ChangeRecord。

dafsq的博客 590

保研考研机试攻略:python笔记(4)

保研考研机试攻略:python笔记(4)二分法+最大公约数+最小公倍数+素数判断+幂次方mod方法+匹配问题+哈希算法+哈夫曼编码+二叉树

qq_63349644的博客 1097

Linux下使用diff和patch制作及打补丁

在做开发的过程中难免需要给内核及下载的一些源码打补丁,所以我们先学习下Linux下使用如如何使用diff制作补丁以及如何使用patch打补丁。 通过diff命令比较出新旧版本之间的差异,并以patch命令来将旧版本更新为新版本。 首先介绍一下diff和patch。 1、diff -------------------- NAME diff - find differences between two files SYNOPSIS diff [options] fr...

Aodongq1n的进击路 378

2. Android_逆向的历史与发展

学完本节,希望你能够:了解 Android 逆向工程的发展历程,从早期 APK 破解到现代应用保护;入门先把这几类「在干啥」搞清楚,后面学脱壳、反反调试会顺很多。(反编译 APK 得到的类汇编代码,相当于程序的「菜谱」)就能绕过验证,到后来混淆、加固、反调试一起上,逆向难度越来越高。(第三节 什么是 CPU 指令集),帮你搞清楚「反汇编看到的那些指令」是从哪来的、和 Android 逆向有啥关系。有必要——先搞清「没加固时怎么玩」,再学脱壳和对抗,思路才顺。读起来费劲,但逻辑还在,耐心一点还能跟。

长沙火山 1391

【转】Linux下使用diff和patch制作及打补丁

在做开发的过程中难免需要给内核及下载的一些源码打补丁,所以我们先学习下Linux下使用如如何使用diff制作补丁以及如何使用patch打补丁。(本篇文章系转载自网友。)首先介绍一下diff和patch。1、diff--------------------NAME       di

jaylondon的技术博客 1107

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

linux生成补丁命令,补丁制作与应用—diff和patch命令的使用

谈及linux补丁(patch)及其patch操作,自然而然地觉其复杂,故一直存敬畏之心,所以也就一直远离它。但像做嵌入式linux开发,有时候patch是无法绕过的。对于补丁制作与应用,实际上就是掌握linuxdiff和patch命令的使用,而这两个命令与linux其它命令一样,也是比较容易掌握的。如果你也有与我之前一样的敬畏心理,建议你不如早早放下这个心理包袱,赶紧掌握这个知识点。关于di...

weixin_42576410的博客 730

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【linux】利用patch和diff命令制作文件补丁

因为在 u-boot 移植过程中,有几处通用文件要修改,如果每次都要手动修改就太麻烦了。制作补丁可以解决这个问题。 学习资料的收集比较简单,方法一类似于这种初级问题网上资料非常丰富, google 或者 baidu 搜索一下,然后选择有价值的资料,方法二是阅读 man 在线文档。完成收集工作,当然最终要在自己的 Linux 上作实验,比较总结,消化吸收为自己的东西。要除去这么一种错误思想:一定要

蜗牛的家 782

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Linux使用diff和patch制作和安装补丁实例

实例a – 制作补丁 命令:diff -urN linux-3.4.2 linux-3.4.2-my > linux-3.4.2-my.patch说明:当前路径为:./ 。该路径(./ )下有 linux-3.4.2 目录,其是linux-3.4.2的源码压缩包解压所得(linux-3.4.2源码未做任何修改的)。该路径(./ )下有 linux-3.4.2-my 目录,其是由l

sdd220的博客 1449

linux利用patch和diff命令制作文件补丁

linux利用patch和diff命令制作文件补丁 因为在 u-boot 移植过程中,有几处通用文件要修改,如果每次都要手动修改就太麻烦了。制作补丁可以解决这个问题。 学习资料的收集比较简单,方法一类似于这种初级问题网上资料非常丰富, google 或者 baidu 搜索一下,然后选择有价值的资料,方法二是阅读 man 在线文档。完成收集工作,当然最终要在自己的...

weixin_34355715的博客 142

linux制作补丁,diff ,patch补丁制作及打补丁工具

文本比较,补丁制作及打补丁工具:diff ,patch示例:cp 两个/etc/rc.d/init.d/functions 文件,修改其中2,[root@localhost mark.raid0.1]# cp functions functions.2[root@localhost mark.raid0.1]# lsfunctions functions.2vim functions.2,添加信息...

weixin_35538624的博客 278

Linux下给内核或源码制作和打补丁操作命令--diff、patch

前言 在做开发的过程中难免需要给内核及下载的一些源码打补丁或者说是升级,所以我们学习在Linux下使用diff制作补丁以及如何使用patch打补丁显得尤为重要。 diff与patch命令介绍 1、 diff命令 NAME diff - find differences between two files SYNOPSIS diff [options] from-file to-fil

谢文浩博客 5279

Linux补丁制作与应用 diff patch

http://linux-wiki.cn/wiki/zh-hans/%E8%A1%A5%E4%B8%81(patch)%E7%9A%84%E5%88%B6%E4%BD%9C%E4%B8%8E%E5%BA%94%E7%94%A8处理单个文件补丁的方法:# 产生补丁 diff -uN from-file to-file &gt;to-file.patch   # 打补丁 patch -p0 &lt; ...

I have a adream 501
上一篇: soft
下一篇: DOS下获得当前文件夹目录的命令
ppby2002
博客等级 码龄23年 65粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值