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

 

 

不断学习中。。。

posted on 2014-04-01 13:02  han'er  阅读(6778)  评论(0编辑  收藏  举报

导航