Linux中 diff与patch的深入分析(转)

摘要:
本文转自http://linux.chinaitlab.com/c/805820.html1)传统格式的Diff输出############。Txt输出:Thisialinetobedeleted Thisialinetat will changed Thisialnetat will

本文转自http://linux.chinaitlab.com/c/805820.html

1) diff的传统格式输出.

  ############################################

  cat 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

  cat 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 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个文件的第1行,这里的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

2) 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.txt.

  #################################

  patch -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

  #################################

3) 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的统一格式比较与输出是按顺序进行的.

4) 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

  输出:

  ls -l old/

  one  two

  ##########################################

5) 检查和合并更改

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

  ##########################################

  vim -d after.txt before.txt

  ##########################################

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

  ##########################################

  gvimdiff after.txt before.txt

  ##########################################

  新建文件orig.c

  ##########################################

  vi 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");

  ##########################################

  vi me.c

  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");

  ##########################################

  vi you.c

  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    }

  ########################################

  为了测试更复杂的环境,新建一个文件orig.c.1

  内容如下:

  ########################################

  vi orig.c.1

  void foo(void)

  {

  printf("This will be changed by both of us.\n");

  }

  ########################################

  用diff3 -m再次比较输出,如下:

  ########################################

  diff3 -m me.c orig.c.1 you.c

  void foo(void)

  {

  <<<<<<< me.c

  printf("This was changed by me. \n");

  printf("This will be unchanged,\n");

  printf("This will be changed by you.\n");

  ||||||| orig.c.1

  printf("This will be changed by both of us.\n");

  =======

  printf("This will be changed by me. \n");

  printf("This will be unchanged,\n");

  printf("This was changed by you.\n");

  >>>>>>> you.c

  }

  ########################################

  注释:以上的格式,同cvs update,需要人工合并文件的格式是一致的.

免责声明:文章转载自《Linux中 diff与patch的深入分析(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java+opencv实现图像灰度化phpcms v9 企业黄页系统发布没有表单出现的解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux中往文件中的某行插入数据 以及 行列转化的做法(paste、xargs等)

sed -i 'nix' test.file        表示向test.file文件里的第n行的前面添加x内容sed -i 'nax' test.file       表示向test.file文件里的第n行的后面添加x内容 sed -i '/m/ix' test.file     表示向test.file文件里匹配m字符串的行的前面添加x内容sed -...

虚拟化技术实现 — KVM 的 CPU 虚拟化

目录 文章目录 目录 前文列表 x86 体系结构的虚拟化 硬件辅助的 CPU 虚拟化 由 VMX 切换支撑的 CPU 虚拟化技术 KVM 的 CPU 虚拟化实现 vCPU 的调度方式 客户机 CPU 拓扑和模型 虚拟机 vCPU 数量分配原则 总结 参考文档 前文列表 《虚拟化技术实现 — 虚拟化技术发展编年史》《虚拟化技术实现 — QEMU-...

petalinux2019.2 zcu106 build error

ug1209 1. Create a PetaLinux project using the following command:$petalinux-create -t project -s <path to the directory that hasxilinx-zcu102-v2019.2-final.bsp> petalinux-cr...

Linux网络命令——ifconfig、ifup、ifdown

 这三个命令的用途都是启动网络接口,不过,ifup 与 ifdown 仅就 /etc/sysconfig/network- scripts 内的 ifcfg-ethx(x为数字)进行启动或关闭的操作,并不能直接修改网络参数,除非手动调整 ifcfg-ethx 文件才行。至于 ifconfig 则可以直接手动给予某个接口 IP 或调整其网络参数。下面我们就分...

virt-manager创建虚拟机

一、virt-manager创建虚机 (1)首先通过命令 virt-manager 启动图形界面: 点下面的图标创建虚机 (2)给虚机命名为 kvm1,这里选择从哪里启动虚机。如果是安装新的 OS,可以选择第一项。如果已经有安装好的镜像文件,选最后一项(如下图)。  (3)接下来需要告诉 virt-manager 镜像的位置,点击 “Browser”...

buildroot使用介绍【转】

转自:https://www.cnblogs.com/arnoldlu/p/9553995.html buildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可...