美文网首页工具使用程序员
Linux命令使用:diff、patch与dirname

Linux命令使用:diff、patch与dirname

作者: zhipingChen | 来源:发表于2018-11-19 19:36 被阅读28次

    Linux 是一种开放源代码的类 UNIX 操作系统,以其安全性和稳定性的优势,加上开源的特性和软件生态,被常用作服务器的操作系统。

    下面列举一些常用的命令使用方式:

    1. dirname <path>

    功能:更改目录结构

    示例:

    tmpuser:~/ $ dirname /a/b/c                                      
    /a/b
    tmpuser:~/ $ dirname /a/b/c/                                
    /a/b
    

    该命令用于返回指定文件的当前目录,这里的指定文件也可以是一个目录。该命令常用于在脚本中切换目录到指定目录下,例如切换到执行的脚本当前目录,示例:

    tmpuser:~/ $ cat test/a/b/c.sh                           
    cd $(dirname $0)
    echo $(pwd)
    tmpuser:~/ $ sh test/a/b/c.sh                                    
    /home/tmpuser/test/a/b
    

    c.sh 文件内容中的 $0意思是取第一个参数,即调用的脚本自身。关于使用 $ 符号取参数相关操作,$* 获得给定脚本的输入参数,不包括脚本自身,$# 获得给定脚本的输入参数个数,不包括脚本自身。

    $ 符号使用示例:

    tmpuser:b/ $ cat c1.sh                                         
    echo $*
    echo $#
    tmpuser:b/ $ sh c1.sh n1 n2                                       
    n1 n2
    2
    
    2. diff <mode> <file1> <file2>

    功能:比较文件修改,生成补丁(patch)文件

    示例:

    tmpuser:b/ $ cat f1                                               
    a
    b
    c
    tmpuser:b/ $ cat f2                                               
    d
    b
    c
    tmpuser:b/ $ diff f1 f2                                            
    1c1
    < a
    ---
    > d
    

    diff 命令用于比较文件的异同,文件的修改无非三种类型:

    • a:addition,增加内容
    • c:change,更改内容
    • d:deletion,删除内容

    上述示例中的比较结果有四行,分析其表示含义:

    1. 1c1 三个字段分别表示 f1 文件第一行发生修改,修改类型为 changef2 文件第一行发生修改
    2. < a 表示f1文件第一行的修改内容为 a
    3. --- 作用为分隔符,分割两个文件的修改内容显示
    4. > d 表示f2文件第一行的修改内容为 d

    由分析可知,这种直接的比较结果较为不直观,后续增加了两种比较模式,能够更清晰的展示文件的差异点。

    【1】diff -c <file1> <file2>

    context上下文模式展示差异

    tmpuser:b/ $ diff -c f1 f2                                         
    *** f1  2018-11-19 17:13:40.751373696 +0800
    --- f2  2018-11-19 17:13:47.787557172 +0800
    ***************
    *** 1,3 ****
    - a
      b
      c
    --- 1,3 ----
      b
      c
    + d
    

    ***---分别表示f1f2文件,修改内容展示以***************分割,*** 1,3 ****--- 1,3 ----分别表示展示的f1f2文件行数的内容,修改的三种类型:增加、更改、删除,在上下文模式中的表示方式为符号表示:

    • +:addition,增加内容
    • !:change,更改内容
    • -:deletion,删除内容

    【2】diff -u <file1> <file2>

    unified统一模式展示差异

    tmpuser:b/ $ diff -u f1 f2                                        
    --- f1  2018-11-19 17:13:40.751373696 +0800
    +++ f2  2018-11-19 17:13:47.787557172 +0800
    @@ -1,3 +1,3 @@
    -a
     b
     c
    +d
    

    ---+++分别表示f1f2文件,@@括起来的内容中,-1,3表示f1文件第一行有删除操作,显示文件一到三行的内容,+1,3表示f2文件第一行有增加操作,显示文件一到三行的内容,两个文件的修改都统一显示在一起。

    diff命令的修改结果可以展示在命令窗口中,帮助查看文件的差异,也可以作为补丁(patch)文件存储起来,方便后续查看,也可以将生成的补丁文件应用到具体文件中,该行为多发生于版本控制系统中。

    diff -Naru <file1> <file2> > <patch_file>

    该命令将比较的修改结果保存到指定文件中。-r表示递归处理目录下文件,-u表示使用统一模式比较,-a表示逐行比较文件内容,-N表示进行目录比较时,若目录下有文件不存在,则与空白文件进行比较,而非显示一句文件是否存在的描述。

    示例:

    tmpuser:b/ $ diff -Naru f1 f2 > patch_file                        
    tmpuser:b/ $ cat patch_file                                       
    --- f1  2018-11-19 17:13:40.751373696 +0800
    +++ f2  2018-11-19 17:13:47.787557172 +0800
    @@ -1,3 +1,3 @@
    -a
     b
     c
    +d
    

    patch文件内容可知,文件内容与直接输出在命令窗口内容相同。

    3. patch <param> < <patch_file>

    功能:应用补丁文件

    示例:

    tmpuser:b/ $ patch < patch_file                                
    patching file f1
    tmpuser:b/ $ cat f1                                              
    b
    c
    d
    

    该命令将diff命令产生的补丁文件应用到具体文件上,观察结果可知,f1文件进行了更新。

    改命令提供了-R参数,应用取消补丁的应用。

    取消应用补丁示例:

    tmpuser:b/ $ patch -R < patch_file                                
    patching file f1
    tmpuser:b/ $ cat f1                                               
    a
    b
    c
    

    观察结果可知,f1文件恢复为原始内容。

    以上所列出的示例,都是相同目录下直接进行文件比较和补丁应用,当遇到包含目录的情况时,需要注意目录等级的调整。

    示例:

    tmpuser:test/ $ diff -Naru d1 d2 > patch_file                      
    tmpuser:test/ $ cat patch_file                                    
    diff -Naru d1/a/b/c/f d2/a/b/c/f
    --- d1/a/b/c/f  2018-11-19 18:56:30.440988972 +0800
    +++ d2/a/b/c/f  2018-11-19 18:57:10.034070898 +0800
    @@ -1,3 +1,3 @@
    -a
     b
     c
    +d
    

    patch_file内容可知,此时比较的是当前目录下,d1/a/b/c/fd2/a/b/c/f两个子文件内容。若在当前目录下使用patch_file文件,则不需要进行目录等级调整,使用如下命令应用补丁文件:

    tmpuser:test/ $ patch -p0 < patch_file                          
    patching file d1/a/b/c/f
    tmpuser:test/ $ cat d1/a/b/c/f                                   
    b
    c
    d
    

    命令中的-p<num>表示忽略几级目录,因为此时正处于和d1,d2同级目录下,所以不需要调整目录等级,参数指定-p0即可。

    不妨进入到d1目录下,再次使用补丁文件,例如使用补丁文件对d1/a/b/c/f文件进行取消补丁应用操作:

    tmpuser:test/ $ cd d1                                             
    tmpuser:d1/ $ patch -Rp1 < ../patch_file                          
    patching file a/b/c/f
    tmpuser:d1/ $ cat a/b/c/f                                        
    a
    b
    c
    

    d1/a/b/c/f文件内容可知,该文件已经取消了对补丁文件的应用。

    因为对补丁的应用中,可能存在目录等级调整的情况,所以在使用diff命令生成补丁文件时,尽量不使用绝对目录指定进行比较的文件。

    相关文章

      网友评论

        本文标题:Linux命令使用:diff、patch与dirname

        本文链接:https://www.haomeiwen.com/subject/xmlofqtx.html