zoukankan      html  css  js  c++  java
  • 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  # 回退成功,和“旧版本”是一样的

    不断学习中。。。

  • 相关阅读:
    C#获取当前路径
    惠普辞退4000员工,今后如何走
    提升你的编码技能,你不知道的免费在线编码资源(上)
    iPhone 5在美销量有望破5000万,Facebook手机何去何从?
    Python获取命令行参数
    C#递归获取文件目录
    Pixel’d:共创美好的像素艺术
    PayPal走向现实支付,消费者们会来买帐吗?
    兼容性测试、手工测试、自动化测试及探索性测试
    冒烟测试 smoking test
  • 原文地址:https://www.cnblogs.com/hanerfan/p/3637438.html
Copyright © 2011-2022 走看看