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 # 回退成功,和“舊版本”是一樣的
不斷學習中。。。