diff和patch命令詳解


  1、diff:compare files line by line

  一般用在純文本文件的比較上,如在軟件包的不同版本之間比較源代碼或配置文件的差異。

  1)選項:-i:忽略大小寫;-b(--ignore-space-change):忽略空格的變化;-B(--ignore-blank-lines):比較時忽略空白行;-a:將比較的文件都當成純文本文件處理;-r:遞歸比較子目錄(如diff -r /etc/rc.d/rc3.d/ /etc/rc.d/rc5.d/比較兩個不同開機運行級別的目錄)。

  2)原理:類似於"最長公共子序列LCS問題"(經典的動態規划問題)。

  假設file1的各行分別表示為A B A C B A D B,file2的各行分別表示為C C B C A B A A。運用動態規划算法,計算出這兩個序列的(一種)最長公共子序列:

  A B A C B A D B

  C C B C A B A A

  對齊之后的結果(上標是各自的行號):

  

  對比diff的輸出:1,3c1、5a4、7d5、8a7,8。1,3c1表示file1的第1~3行被file2的第1行代替;5a4表示file2新增了第4行,基准是file1的第5行(之后);7d5表示file1的第7行在file2中被刪除了,基准是file2的第5行(之后);8a7,8類似於5a4。

 

  2、patch:apply a diff file to an original

  如diff比較新舊兩個文件的差異后,將比較結果保存到patch文件里,然后使用patch文件升級舊文件(打補丁),或把新文件回退成舊文件(卸載補丁):

// test1.cpp
#include <iostream>
using namespace std;

int main()
{
    cout << "hello world" << endl;

    return 0;
}
// test2.cpp
#include <iostream>

int main()
{
    std::cout << "hello world" << std::endl;

    return 0;
}

  以下演示patch命令的用法:

diff -u test1.cpp test2.cpp > patchfile  # 將比較結果保存到patch文件
patch -b test1.cpp patchfile # 對test1.cpp應用patch文件(升級),並備份(test1.cpp.orig)
diff test1.cpp test2.cpp  # 升級成功,此時test1.cpp和test2.cpp是一樣的
patch -R test1.cpp patchfile  # 將test1.cpp回退到“舊版本”
diff test1.cpp test1.cpp.orig  # 回退成功,和“舊版本”是一樣的

 

 

不斷學習中。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM