`

Linux diff与patch的使用

 
阅读更多

用了这么久linux,发现还有这么精妙的功能没有使用到,都不好意思跟人说我会linux了。

 

首先提供两个测试使用的简单文本文件

before.txt

This is a line to be deleted
This is a line that will be changed
This is a line that will be unchanged

 

 after.txt

This is a line that has been changed
This is a line that will be unchanged
This is a line that has been added

 

  • diff的传统格式输出
diff before.txt after.txt 
1,2c1
< This is a line to be deleted
< This is a line that will be changed
---
> This is a line that has been changed
3a3
> This is a line that has been added

 

 说明:

1,2c1是指替换第1个文件的第1,2行到第2个文件的第2行,这里的1,2是指第1个文件的第1,2行,c是替换的意思,最后的1是第2个文件的第1行。
<号是指第1个文件更改或删除的行。
—号是分割两个文件。
>号是第2个文件中增加或删除的行。
3a3是指将第2个文件的第3行插入到第一个文件的第3行。也就是说第1个文件的:

< This is a line to be deleted
< This is a line that will be changed

 

 被替换成第2个文件的:

> This is a line that has been changed

由于第1个文件的第3行和第2个文件的第2行一致,所以不做修改。

 

由于第2个文件的第3行是第1个文件所不具有的,所以在第1个文件的最后一行增加:

> This is a line that has been added

 

  • diff的统一格式输出
diff -u before.txt after.txt | tee mypatch.diff
--- before.txt  2009-06-20 05:21:49.000000000 +0800
+++ after.txt   2009-06-20 04:03:16.000000000 +0800
@@ -1,3 +1,3 @@
-This is a line to be deleted
-This is a line that will be changed
+This is a line that has been changed
 This is a line that will be unchanged
+This is a line that has been added

 

 说明:

diff -u选项是统一格式输出.
— before.txt 2009-06-20 05:21:49.000000000 +0800
— before.txt是指旧文件
+++ after.txt 2009-06-20 04:03:16.000000000 +0800
+++ after.txt是指新文件.
@@ -1,3 +1,3 @@
@@ -1,3是指第1个文件一共有3行,+1,3 @@是指第2个文件一共有3行.

-This is a line to be deleted
-This is a line that will be changed

 

 是被删除的行

+This is a line that has been changed

 

 是增加的行

This is a line that will be unchanged

 

 没有-号和+号是指该行不变,因为after.txt和before.txt都有这行.

+This is a line that has been added

 是增加的行

 

diff的统一格式比较与输出是按顺序进行的。

 

  • patch命令的应用:
使用diff的传统格式输出补丁文件
diff before.txt after.txt > mypatch.txt

 

 用patch修补before.txt文件,使before.txt和after.txt一致.

cat mypatch.txt | patch before.txt 
patching file before.txt

 

 比较两个文件,现在是一致的了

cmp before.txt after.txt

 用patch命令恢复before.txtpatch -R before.txt < mypatch.txt

patching file before.txt

 注:-R标记告诉patch在反向上应用区别或者撤销patch.

再比较两个文件,现在不一致了.

cmp before.txt after.txt 
before.txt after.txt differ: byte 17, line 1

 

  • diff命令在目录中的应用

 

新建old和new目录,old目录包含了初始内容,new目录包含文件的最新版本

mkdir old new
echo "This is one. It's unchanged." | tee old/one new/one
echo "This is two. It will change." > old/two
echo "This is two. It changed."> new/two
echo "This is three. It's new" > new/three

 

 创建修补文件

diff -Nur old/ new/ > mypatch.diff

 

注:-r选项按照文件目录递归创建修补文件;-u还是统一模式;-N是指当diff遇到一个只存在于两个树中的一个树中的文件时,默认情况下跳过文件并且打印一个警告到stderr。这个行为可以通过-N选项来更改,这也导致了diff认为丢失的文件实际上是存在的,但它是空的.采用这种方式,一个修补文件可以包括已经创建的文件.然后应用修补程序创建新的文件.

more mypatch.diff 
# 输出:
diff -Nur old/three new/three
--- old/three   1970-01-01 08:00:00.000000000 +0800
+++ new/three   2009-06-20 06:55:34.000000000 +0800
@@ -0,0 +1 @@
+This is three. It's new
diff -Nur old/two new/two
--- old/two     2009-06-20 06:55:08.000000000 +0800
+++ new/two     2009-06-20 06:55:21.000000000 +0800
@@ -1 +1 @@
-This is two. It will change.
+This is two. It changed.

 注释:

 

 

diff -Nur old/three new/three是指下面比较old/three new/three两个文件。因为没有old/three文件,所以在old/three中增加+This is three。 It’s new diff -Nur old/two new/two是指下面比较old/two new/two两个文件。因为old/two与new/two的第3行不一致,所以删除This is two. It will change.增加This is two. It changed.

 

打补丁到old目录,新建old/three以及更改old/two

patch --dir old < mypatch.diff
ls -l     old/
# 输出:
one    three  two

 恢复old目录的内容,包括删除old/three,以及恢复old/two文件patch --dir old -R < mypatch.diff

patch --dir old -R < mypatch.diff
# 输出:
ls -l old/
one  two

 

  •  检查和合并更改

用vim突出显示单个字符的更改来表示区别

vim -d after.txt before.txt

 

 用gui工具gvimdiff来显示两个文件

gvimdiff after.txt before.txt

 

 新建文件orig.c

 

void foo(void)
{
    printf("This will be changed by me. \n");
 
    printf("This will be unchanged,\n");
 
    printf("This will be changed by you.\n");
}

 复制文件orig.c到me.c,更改第4行为printf(”This was changed by me. \n”);

 

 

void foo(void)
{
    printf("This was changed by me. \n");
 
    printf("This will be unchanged,\n");
 
    printf("This will be changed by you.\n");
}

 

 复制文件orig.c到you.c,更改第7行为printf(”This was changed by you.\n”);

 

void foo(void)
{
    printf("This will be changed by me. \n");
 
    printf("This will be unchanged,\n");
 
    printf("This was changed by you.\n");
}

 

 版本工具如cvs,subversion使用GNU合并工具称为diff3

 

diff3 me.c orig.c you.c 
#输出:
====1
1:3c
      printf("This was changed by me. \n");
2:3c
3:3c
      printf("This will be changed by me. \n");
====3
1:7c
2:7c
      printf("This will be changed by you.\n");
3:7c
      printf("This was changed by you.\n");

 注:

 

在没有参数的情况下,diff3产生的输出说明了那行更改.
====1和====3指明造成同原始文件不同的是哪一个修改文件.
编号方式基于参数序列.
也就是第1个文件和第3个文件与原文件不同.

 

1:3c
      printf("This was changed by me. \n");
3:3c
      printf("This will be changed by me. \n");

 1:3c表示第1个文件的第3行与3:3c表示的第3个文件的第3行不同.

 

为什么不显示与原文件的比较呢。因为第3个文件的第3行与源文件(第2个文件)相同.所以与哪个文件比较无所谓了.

 

2:7c
      printf("This will be changed by you.\n");
3:7c
      printf("This was changed by you.\n");

 

 2:7c表示第2个文件的第7行与3:7c表示的第3个文件的第7行不同.

diff3会试图为我们进行合并.合并是在源文件的基础上,依据两个新文件进行修改。源文件是第二个文件,第一个文件和第三个文件可以互换,但他们必须有共同的祖先,就是第二个文件.

 

diff3 -m me.c orig.c you.c |cat -n
#输出:
     1    void foo(void)
     2    {
     3        printf("This was changed by me. \n");
     4    
     5        printf("This will be unchanged,\n");
     6    
     7        printf("This was changed by you.\n");
     8    }

 

 

参考来源:

http://gooss.org/linux-diff-and-patch-depth-analysis-of/

分享到:
评论
1 楼 shiq_stone 2011-10-21  
这个东西更有意思

$vimdiff scp://eric@192.168.1.11/~/remote_file.txt ~/local_file.txt 

相关推荐

    linux diff & patch

    Linux diff和patch是GNU Diffutils软件包的一部分,这些工具用于展示、比较和合并文件的差异。了解diff的原理和使用方式,可以帮助用户有效地管理和同步文件更改。diff命令可以比较文件之间的差异,并以多种格式输出...

    diff和patch说明

    1. **基本功能**:`patch`工具接受`diff`生成的输出文件,将其应用于原始文件,从而更新文件内容,使其与另一个文件一致。 2. **应用`diff`输出**:`patch`会根据`diff`文件中的信息,逐行修改目标文件,将修改应用...

    linux 打补丁patch 详解

    Linux 打补丁 Patch 详解 Linux 打补丁 Patch 是一种常用的方法来升级 Linux 内核版本。下面是关于 Linux 打补丁 Patch 的详细解释。 什么是补丁? ---------------- 补丁是一个文本文档,包含了在两个不同版本的...

    linux下patch安装包

    - `patch-2.6.tar.gz`和`patches3.0.tgz`可能分别包含针对Linux内核2.6和3.0的补丁文件,每个`.diff`文件对应源代码的一个或多个更改。 3. **解压和应用补丁**: - 对于`patch-2.6.tar.gz`和`patches3.0.tgz`,...

    如何使用diff和patch

    1) 在数学上来说:diff/patch,diff是对2个集合求差,patch是求和 ... diff -uNr linux-2.6.xxx linux-2.6.xxx.1 &gt; diff.patch  升级  cp diff.patch linux-2.6.xxx/.  cd linux-2.6.xxx  patch -p1 &lt; diff.p

    Linux初学者Patch使用指南

    ### Linux初学者Patch使用指南详解 #### 一、Patch简介及历史背景 Patch是一种用于比较两个文件或目录之间差异,并将这些差异应用到另一个文件或目录中的工具。它最初是在网络带宽有限的时代被广泛采用的,目的是...

    linux diff命令详解

    ### Linux Diff 命令详解 #### 一、概述 `diff` 是 Linux 下一个非常实用的工具,用于比较两个文件或目录之间的差异。它可以帮助用户快速找出不同文件中的改动部分,这对于版本控制、代码审查及文件对比等场景非常...

    Windows下的diff,适用于windows10以下任何版本

    在Windows操作系统中,通常我们不会直接使用类似于Linux...不过需要注意的是,虽然Windows的`diff`工具与Linux下的`diff`在功能上相似,但可能在某些选项或行为上有所不同,具体使用时需要查阅相关文档以确保正确操作。

    Linux下patch的制作和应用

    # Linux 下 Patch 的制作与应用详解 ## 一、引言 在 Linux 开发和维护过程中,经常需要对源代码进行修改以适应不同的需求。为了方便地管理这些更改,并能够轻松地将更改应用到新的代码版本中,使用 `patch` 和 `...

    详解Linux patch命令参数及用法

    diff命令,在制作patch文件的时候,基本上只需要使用到diff -Nau 这个参数,如果比较的是文件夹,还要加上-r参数,所以一般直接使用Naur参数。 功能说明:修补文件。 语 法:patch [-bceEflnNRstTuvZ][-B &lt;备份...

    嵌入式系统/ARM技术中的如何使用diff和patch

    1) 在数学上来说:diff/patch,diff是对2个集合求差,patch是求和 ... diff -uNr linux-2.6.xxx linux-2.6.xxx.1 &gt; diff.patch  升级  cp diff.patch linux-2.6.xxx/.  cd linux-2.6.xxx  patch -p1 &lt; diff.p

    armboot-org2mini2440.diff patch补丁包

    armboot-org2mini2440.diff:patch补丁包 补丁方法:将原始的armboot程序包armboot-1.1.0.tgz 解开后,将armboot-org2mini2440.diff文件放到和armboot-1.1.0的同级目录上,不要拷贝到 armboot-1.1.0 目录里面,...

    bc、diff、patch、iperf、sshpass工具源码包

    这里提到的“bc、diff、patch、iperf、sshpass”是一组常用且功能各异的开源工具,它们在不同的场景下有着重要的作用。让我们逐一深入探讨这些工具的详细知识。 **bc**: BC 是一个交互式的、高度可移植的编程语言,...

    shell中常用的命令之diff和patch用法

    在Linux和Unix环境中,Shell命令是用户与操作系统交互的基础工具,其中`diff`和`patch`是两个非常实用的命令,主要用于文件和目录的比较以及应用补丁。这两个命令在软件开发、版本控制以及系统维护中起着至关重要的...

    Linux下patch打补丁命令实例详解.txt

    在Linux系统中,`patch`命令是一个非常重要的工具,用于将源代码的差异(通常由`diff`工具生成)应用到现有的源代码库上,从而实现对软件的更新或修复。本文将深入探讨`patch`命令的用法及其在实际场景中的应用实例...

    每天一个linux命令(36):diff 命令.docx

    `diff`的输出可以被`patch`命令解析,从而根据`diff`的输出将一个文件更新为另一个文件的状态,这对于版本管理和代码协作非常有用。 总的来说,`diff`命令是Linux系统中进行文件和目录比较的利器,通过各种参数组合...

    Linux中patch文件的使用.doc

    在Linux系统中,`patch`命令和`diff`工具是非常重要的文件对比与合并工具。它们主要用于软件开发过程中的版本管理和更新,尤其在开源社区中非常常见。通过这些工具,开发者可以轻松地在不同版本之间进行代码比较,并...

    Linux命令学习手册-patch命令

    我们可以使用`diff`命令来生成这两个文件之间的补丁文件`test1.patch`。 ```bash $ diff -uN test0 test1 &gt; test1.patch ``` 这里`-u`指定了使用unified diff格式,`-N`则表示即使文件不存在也要创建新文件。执行...

    Linux下Patch的应用和制作方法

    因为在u-boot移植过程中,有几处通用文件要修改,如果每次都要手动修改就太麻烦了。制作补丁可以解决这个问题。本文首介绍一下diff和patch。然后介绍了制作Patch为单个文件和多个文件进行补丁操作的方法。

Global site tag (gtag.js) - Google Analytics