日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux -- Linux diff与patch的深入分析

發布時間:2023/12/10 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux -- Linux diff与patch的深入分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

diff的輸出格式分為傳統格式和統一格式

?

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個文件的第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

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,需要人工合并文件的格式是一致的.

轉載于:https://www.cnblogs.com/zym0805/archive/2012/02/15/2352830.html

總結

以上是生活随笔為你收集整理的linux -- Linux diff与patch的深入分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜av网| 香蕉av777xxx色综合一区 | zjzjzjzjzj亚洲女人 | 精品成人一区二区三区久久精品 | 无套内谢的新婚少妇国语播放 | 天天干天天透 | 女同二区 | 就爱啪啪网 | 国产婷婷在线视频 | 天堂视频一区 | 久久这里只有精品6 | 中文字幕在线2019 | 欧美黄色a级大片 | 天天想你在线观看完整版高清 | 97视频免费看 | 日本少妇与黑人 | 久草视频免费在线观看 | 亚洲图片欧美另类 | 成人免费视频免费观看 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲精品欧美精品 | av在线收看| 免费av观看 | 农村黄色片 | 亚洲一区二区三区久久久成人动漫 | 久久久国 | 中文字幕一区av | 国产女优在线播放 | 亚洲一级片免费看 | 国产精品免费在线 | 中文字幕影片免费在线观看 | 深夜视频免费在线观看 | 欧美性猛交性大交 | 亚洲一区二区三区婷婷 | xxxx18日本 | 中国黄色网页 | 亚洲av综合色区无码一区 | 亚洲第一自拍 | 亚洲最大福利 | 欧美体内she精高潮 日韩一区免费 | 免费一级a毛片 | 无码国产精品一区二区高潮 | 欧美激情一区二区三区免费观看 | 一区二区片 | av激情在线观看 | 丁香花高清在线观看完整动漫 | 久久久久国产精品熟女影院 | 亚洲国产麻豆 | 国产午夜精品福利视频 | 91黄色片| 五月婷综合网 | 欧美激情在线观看视频 | 日韩国产欧美综合 | 欧美日韩一二三四区 | av黄网站 | 国产美女在线播放 | 九色在线 | 人妻丰满熟妇av无码区不卡 | xxxwww国产| 黑料视频在线 | 丝袜 亚洲 另类 欧美 重口 | たちの熟人妻av一区二区 | 亚洲在线第一页 | 国产偷人 | 欧美日韩精品中文字幕 | 亚洲av永久无码精品放毛片 | 污污视频在线免费观看 | 九九久久国产 | 中文字幕第23页 | 国产精品乱码久久久久 | 午夜影院在线视频 | 日韩视频在线观看一区 | 少妇熟女一区二区 | 在线看的网站 | 一级aa毛片 | 密臀av在线 | 欧美精品二区三区四区免费看视频 | av手机天堂 | 污污网站在线看 | 久久久香蕉网 | 国产一区二区三区四区hd | 激情小说图片视频 | 99视频网站 | 影音先锋亚洲资源 | 日韩视频免费观看高清完整版 | 日韩视频精品 | 日本一级视频 | 久久丫精品国产亚洲av不卡 | 黑人与日本少妇高潮 | 久久久久午夜 | 久久久7777 | 97久久综合| av毛片在线免费观看 | 在线国产一区二区 | 潘金莲黄色一级片 | 欧美成人dvd在线视频 | 久久久久久人妻一区二区三区 | 日本视频网址 | 91亚州|