一、原理

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

patch能将diff文件运用于 原来的两个集合之一,从而得到另一个集合。

举个例子来说文件A和文件B,经过diff之后生成了补丁文件C,那么着个过程相当于 A -B = C ,那么patch的过程就是B+C = A 或A-C =B。

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

二、用法

1. diff的用法

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

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

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

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

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

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

复制代码代码如下:

patch -p1

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

最后有以下几点注意:

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

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

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

三、举例

通常情况下,diff与patch一起使用。即使用patch调用diff文件。如下面这个例子:

有两个目录为old和new,old中有f1.c,f2.c;new中有f1.c,f3.c。现要将new补到old上。

复制代码代码如下:

[fsy@localhost ~]$ mkdir old new

[fsy@localhost ~]$ cd old

[fsy@localhost old]$ touch f1.c f2.c

###建立两个文件夹和old中的文件

[fsy@localhost old]$ echo 1 > f1.c

[fsy@localhost old]$ cat f1.c

1

[fsy@localhost old]$ echo 2 > f2.c

###在old的文件中写入内容

[fsy@localhost old]$ cd ../new

[fsy@localhost new]$ touch f1.c f3.c

[fsy@localhost new]$ echo new 1 > f1.c

[fsy@localhost new]$ cat f1.c

new 1

[fsy@localhost new]$ echo 3 > f3.c

###建立new文件并写入内容

[fsy@localhost new]$ cd ..

[fsy@localhost ~]$ diff -Nuar old new >dir.diff

[fsy@localhost ~]$ cat dir.diff

diff -Nuar ./old/f1.c ./new/f1.c

--- old/f1.c 2011-08-30 12:32:21.553737454 +0800

+++ new/f1.c 2011-08-30 12:34:28.444148124 +0800

@@ -1 +1 @@

-1

+new 1

diff -Nuar ./old/f2.c ./new/f2.c

--- old/f2.c 2011-08-30 12:32:40.334207279 +0800

+++ new/f2.c 1970-01-01 08:00:00.000000000 +0800

@@ -1 +0,0 @@

-2

diff -Nuar ./old/f3.c ./new/f3.c

--- old/f3.c 1970-01-01 08:00:00.000000000 +0800

+++ new/f3.c 2011-08-30 12:34:42.331754293 +0800

@@ -0,0 +1 @@

+3

###可以清楚的看见两个文件夹下文件的不同之处

[fsy@localhost ~]$ cd old ..........................................必须进入到要打补丁的文件夹

[fsy@localhost old]$ patch -p1 < ../dir.diff

patching file old/f1.c

patching file old/f2.c

patching file old/f3.c

[fsy@localhost old]$ ls

f1.c f3.c

[fsy@localhost old]$ cat f1.c

new 1

[fsy@localhost old]$ cat f3.c

3

[fsy@localhost old]$

###f2.c被删除,f1.c和f3.c被更新。

linux patch 给文件打补丁,Linux补丁工具patch生成使用补丁用法示例相关推荐

  1. linux 几个文件夹作用,linux下每一个文件夹的作用.docx

    目录结构及主要内容 "/"根冃录部分有以F子冃录: /usr 口录包含所有的命令.程序库.文档和英它文件.这些文件在正常操作中不会被改变的.这个目录也包含你的Linux 发行版本的 ...

  2. linux 穿件文件_关于Linux的25件事

    linux 穿件文件 今天是Linux 25年的历史,这是有史以来最成功的软件. 在本周的LinuxCon上,Linux基金会的Jim Zemlin在主题演讲中表达了钦佩,赞美和激动,他说:" ...

  3. linux文件系统中文件基本权限,Linux文件权限基本属性图文详解

    [概述] 在 Linux 系统中,不同的用户处于不同的地位,拥有不同的权限,为保护系统安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定. Linux 系统的每一个文 ...

  4. linux终端传文件,如何使用Linux FTP命令传输文件

    FTP(文件传输协议)是一种标准的网络协议,用于在远程网络之间传输文件. 在本教程中,我们将通过实际示例向您展示如何使用Linux ftp命令. 在大多数情况下,您将使用桌面FTP客户端连接到远程服务 ...

  5. linux系统访问文件夹ls,Linux系统目录结构,文件类型以及ls、alias命令

    一.Linux目录结构 登录系统之后,在当前命令窗口输入以下指令,/是Linux操作系统里最核心的一个目录,所有的文件和目录全部在它下面,所以称为"根目录": # ls / //列 ...

  6. linux的日记文件放哪,linux的日记文件在哪_网站服务器运转保护,linux

    日记文件是特地用于纪录体系操纵事宜的纪录文件或文件鸠合,日记文件一般保留在/var/log目录下. 下面是几个主要的日记文件: /var/log/messages:包括团体体系信息,个中也包括体系启动 ...

  7. linux 定时传送文件,Windows与Linux之间定时文件传输

    需要的朋友点击链接,这里有更详细的实现过程 一.获取WinSCP windows上装上Winscp程序,使用这个程序通过sftp协议把本地的文件传输到linux服务器上. winscp下载链接 二.编 ...

  8. 两个linux系统拷贝文件,两台linux文件拷贝

    scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用ssh1,并且和ssh1使用相同的认证方式,提供相同的安全保证.与rcp不同的是,scp会要求你输入密码如果需要的话. 最简单的 ...

  9. linux给文件夹加密码,如何使用linux命令给文件上锁?linux命令文件加密方法

    如何用linux命令给文件夹加密上锁呢?这是很多linux用户会碰到的问题,今天小编给大家介绍下linux命令给文件加密上锁的方法. 怎么用linux命令给自己的文件上锁 原因: 有些时候一个工程需要 ...

  10. linux批量对文件改名,在Linux中对文件进行批量重命名文件的方法

    在Linux中,当你想要改变一个文件名,使用mv命令就好了.然而mv不能使用通配符重命名多个文件.可以用sed.awk或者与xargs结合使用来处理多个文件的情况.然而,这些命令行即繁琐又不友好,并且 ...

最新文章

  1. *:教育产品 规范销售
  2. CentOS6.4_X86_64 安装Drupal-7.31必须成功版!
  3. 网工路由基础(7)策略路由PBR
  4. Opengl超级宝典笔记——空间绘图画点
  5. 压箱底总结:流系统端到端一致性对比
  6. lua面向对象编程之点号与冒号的差异详细比较
  7. python数据库增删改查_python对数据库mysql的操作(增删改查)
  8. UVALive 7077 Little Zu Chongzhi's Triangles (有序序列和三角形的关系)
  9. P1879 [USACO06NOV]玉米田Corn Fields
  10. 麻省理工18年春软件构造课程阅读10“抽象数据类型”
  11. java如何实现web页面聊天_Java和websocket实现网页聊天室
  12. 全国计算机技术与软件专业资格(水平)考试报考指南
  13. Spring Cloud Gateway 没有链路信息,我 TM 人傻了(下)
  14. 安卓虚拟键盘_安卓这些年变化多惊人?那些老玩家才懂的回忆
  15. mac下 iterm+Zsh+Oh My Zsh+tmux 配置方案
  16. SOIC8E (EXPOSED PAD)
  17. 计算机视觉中头部姿态估计的研究综述--Head Pose Estimation in Computer Vision - A Survey
  18. ssm毕设项目酒店管理系统08281(java+VUE+Mybatis+Maven+Mysql+sprnig)
  19. 我国不同类别水泥对应的质量标准及物理性能
  20. C语言小白初试 7-1 求一元二次方程的根 (20 分)

热门文章

  1. i7 9750h和i5 9400参数对比哪个好
  2. ICEM: 合并混合网格
  3. OFDM子载波频率 知乎_频谱中射频干扰信号流化、分析与回放
  4. Win10极限精简版Tiny10发布:仅占C盘4.3GB
  5. 引导扇区维护工具linux,bootice引导扇区维护工具(bootice1.3.4新版及1.3.3经典版)...
  6. 超30亿人脸数据被泄露,美国AI公司遭科技巨头联合“封杀”
  7. linux rarcrack破解rar、zip和7z压缩包简单密码的工具
  8. 距离2022年研究生考试还有多少天?倒计时天数用便签设置
  9. VS2017好用的插件推荐
  10. VS Code插件离线安装教程