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 # 回退成功,和“旧版本”是一样的
不断学习中。。。