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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275007.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275007.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275007.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

shell命令之---sed

1. sed編輯器基礎 1.1 替換標記 命令格式&#xff1a;s/pattern/replacement/flags $ cat data4.txt    This is a test of the test script.    This is the second test of the test script.    有4種可用的替換標記&#xff1a; 數字&#xff0c;表明新文本將替…

SEE Conf: Umi 4 設計思路文字稿

大家好&#xff0c;我是若川。持續組織了5個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。復制此鏈接 https:…

用戶體驗改善案例_改善用戶體驗研究的5種習慣

用戶體驗改善案例There’s plenty of misunderstanding around user research, whether it’s the concept of validation or one-off anecdotes being thrown around as concrete evidence for a product decision.用戶研究存在很多誤解&#xff0c;無論是驗證的概念還是一次性…

一場賽跑引起的并發知識

享學特邀作者&#xff1a;老顧前言我們小伙伴們是不是經常需要測試代碼的性能&#xff1f;小伙伴們是不是就會想到jmeter進行壓力測試一下&#xff0c;模擬N個用戶同時執行下&#xff0c;看看響應的時間多少。今天老顧就用一個經典的比賽案例&#xff0c;來嘗試自行編寫個比賽業…

oracle中使用子查詢為何取到大于自然數1 rownum 淺度解析

Oracle 沒有提供TOP N 語句&#xff0c;若希望按特定條件查詢前N 條記錄&#xff0c;可以使用偽列ROWNUM。 ROWNUM 是對結果集加的一個偽列&#xff0c;即先查到結果集之后再加上去的一個列(注意&#xff1a;先要 有結果集)。 rownum 的值是oracle 順序分配的從查詢返回的行的編…

巴克萊對沖_“巴克萊的財政預算案”:使金錢管理對心理健康有效—用戶體驗案例研究

巴克萊對沖Disclaimer: all official Barclays assets used for this project are purely for educational/project purposes only and do not reflect the intentions of Barclays or any of its affiliates.免責聲明&#xff1a;用于此項目的所有官方巴克萊資產純粹是出于教育…

6 個對所有 Web 開發者都有用的 GitHub 倉庫

作者&#xff1a;Mehdi Aoussiad原文&#xff1a;https://javascript.plainenglish.io/6-useful-github-repositories-for-all-web-developers-44f26912fd66大家好&#xff0c;我是若川。持續組織了5個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&…

快速刪除數據庫中所有表中的數據

今天又學到一招&#xff0c;可以快速刪除數據庫中所有的用戶表中的數據。我是個菜鳥&#xff0c;望各位大神多多指教 select truncate table Name ; from sysobjects where xtypeU order by name asc; 該條語句執行之后會將數據庫中所有的表都查詢出來&#xff0c;復制出來之…

openfiler的iSCSI配置(二)

為什么80%的碼農都做不了架構師&#xff1f;>>> 一.openfiler iSCSI配置 1.啟動iSCSI target server服務。在Services列表下。 2.設置訪問列表。在System---Network Access Configuration下設置。 3.創建卷設備 二.ISCSI客戶端配置 1.安裝open-iscsi # apt-get ins…

送你一份用Electron開發桌面應用的避坑指南【送3本書,含犀牛書】

大家好&#xff0c;我是若川。持續組織了5個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;新年第一次送3本書。抽獎規則見文末。如今&#xff0c;Electron 領域發生了重大的變革&#xff0c;Electron 版本更新換代極快&#xff0c;難以計數…

時間續

mois : janvier fvrier mars avril mai juin juillet aot septembre octobre novembre dcembre semaine : lundi mardi mercredi jeudi vendredi samedi dimanche 轉載于:https://www.cnblogs.com/lavieenrose/archive/2012/02/18/2357597.html

nginx修改upstream不重啟的方法(ngx_http_dyups_module模塊)

為什么80%的碼農都做不了架構師&#xff1f;>>> nginx很強大&#xff0c;第三方模塊也不少,淘寶在nginx上很活躍&#xff0c;特別是章亦春&#xff0c;他參與的模塊至少10&#xff0c; 好了今天主角不是他&#xff0c;是一款動態配置upstream的模塊&#xff0c;這個…

c# 設計原則需要學習嗎_向最好的學習:產品設計原則

c# 設計原則需要學習嗎重點 (Top highlight)In my job as Design Team Lead at SimpleSite, I’ve recently been part of creating a set of Product Design Principles. In this process, I spent a lot of time studying the theory, learning about best practices, and ge…

初學Java-接口

在Java語言中&#xff0c;接口有兩種意思&#xff1a; 一是指概念性的接口&#xff0c;即指系統對外提供的所有服務。類的所有能被外部使用者訪問的方法構成了類的接口 二是指用interface關鍵字定義的實實在在的接口&#xff0c;也稱為接口類型。它用于明確的描述系統對外提供的…

Node.js 2021年開發者報告解讀

大家好&#xff0c;我是若川。持續組織了5個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。很多人覺得Node.js…

搭建nginx反向代理用做內網域名轉發

為什么80%的碼農都做不了架構師&#xff1f;>>> 情景 由于公司內網有多臺服務器的http服務要映射到公司外網靜態IP&#xff0c;如果用路由的端口映射來做&#xff0c;就只能一臺內網服務器的80端口映射到外網80端口&#xff0c;其他服務器的80端口只能映射到外網的…

外國經典兒童讀物合集pdf_幫助父母在線購買兒童讀物–用戶體驗案例研究

外國經典兒童讀物合集pdfT? As our first group project at GA, we needed to quickly learn how to use several online tools that helped our team of 4 collaborate and communicate while socially distant. Despite the rather extreme circumstances our team was stil…

Windows Azure Marketplace增加對六種語言和HTML5應用程序的支持

對于那些不熟悉Windows Azure Marketplace的人來說&#xff0c;它是一個供數據供應商和開發人員購買和銷售數據集和應用程序的在線市場。 可以在世界上的26個國家使用Windows Azure Marketplace&#xff0c;它現在支持6種語言&#xff0c;包括日語、漢語、法語、德語、西班牙語…

如何優雅處理 async await 錯誤——解讀小而美的 await-to-js 庫

大家好&#xff0c;我是若川。持續組織了5個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。這是源碼共讀活動第…

同態加法_同態的Spotify

同態加法重點 (Top highlight)When neumorphism was predicted to be one of the top 2020 UI design trends, I wanted to give it a shot. Having said that, I wanted to explore a type that had not gone overboard, neumorphism in Dark Mode.當neumorphism預計為頂部202…