• 比较文件命令之diff,patch,vimdiff,cmp


    diff

    比较两个文件之间的区别

    [20:34:32 root@C8-3-55 ~]#diff --help
    用法:diff [选项]... 文件们
    逐行比较<文件们>。
    
    长选项的必需参数也是相应短选项的必需参数。
          --normal                  以正常的 diff 方式输出 (默认)
      -q, --brief                   只有在文件不同时报告
      -s, --report-identical-files  当两个一样时仍然显示结果
      -c, -C NUM, --context[=NUM]   output NUM (default 3) lines of copied context
      -u, -U 数量, --unified[=数量] 输出 <数量>(默认为 3)行一致化上下文
      -e, --ed                      以 ed script 方式输出
      -n, --rcs                     以 RCS diff 格式输出
      -y, --side-by-side            output in two columns
      -W, --width=数量              每行显示最多 <数量>(默认 130)个字符
          --left-column             当有两行相同时只显示左边栏的一行
          --suppress-common-lines   当有两行相同时不显示
    
      -p, --show-c-function         show which C function each change is in
      -F, --show-function-line=RE   show the most recent line matching RE
          --label LABEL             use LABEL instead of file name and timestamp
                                      (can be repeated)
    
      -t, --expand-tabs             将输出中的 tab 转换成空格
      -T, --initial-tab             每行先加上 tab 字符,使 tab 字符可以对齐
          --tabsize=数字           TAB 格的宽度,默认为 8 个打印列宽
          --suppress-blank-empty    suppress space or tab before empty output lines
      -l, --paginate                将输出送至 “pr” 指令来分页
    
      -r, --recursive                 连同所有子目录一起比较
          --no-dereference            don't follow symbolic links
      -N, --new-file                  不存在的文件以空文件方式处理
          --unidirectional-new-file   若第一文件不存在,以空文件处理
          --ignore-file-name-case     忽略文件名大小写的区别
          --no-ignore-file-name-case  不忽略文件名大小写的区别
      -x, --exclude=模式              排除匹配 <模式> 的文件
      -X, --exclude-from=文件         排除所有匹配在<文件>中列出的模式的文件
      -S, --starting-file=文件        当比较目录時,由<文件>开始比较
          --from-file=文件1           将<文件1>和操作数中的所有文件/目录作比较;
                                        <文件1>可以是目录
          --to-file=文件2             将操作数中的所有文件/目录和<文件2>作比较;
                                        <文件2>可以是目录
    
      -i, --ignore-case               忽略文件内容大小写的区别
      -E, --ignore-tab-expansion      忽略由制表符宽度造成的差异
      -Z, --ignore-trailing-space     忽略每行末端的空格
      -b, --ignore-space-change       忽略由空格数不同造成的差异
      -w, --ignore-all-space          忽略所有空格
      -B, --ignore-blank-lines        忽略任何因空行而造成的差异
      -I, --ignore-matching-lines=正则 若某行完全匹配 <正则>,则忽略由该行造成的差异
    
      -a, --text                      所有文件都以文本方式处理
          --strip-trailing-cr         去除输入内容每行末端的回车(CR)字符
    
      -D, --ifdef=名称                输出的内容以 ‘#ifdef <名称>’ 方式标明差异
          --GTYPE-group-format=GFMT   以 GFMT 格式处理 GTYPE 输入行组
          --line-format=LFMT          以 LFMT 格式处理每一行资料
          --LTYPE-line-format=LFMT    以 LFMT 格式处理 LTYPE 输入的行
        These format options provide fine-grained control over the output
          of diff, generalizing -D/--ifdef.
        LTYPE 可以是 “old”、“new” 或 “unchanged”。GTYPE 可以是 LTYPE 的选择
        或是 “changed”。
      (仅)GFMT 可包括:
          %<  该组中每行属于<文件1>的差异
          %>  该组中每行属于<文件2>的差异
          %=  该组中同时在<文件1>和<文件2>出现的每一行
          %[-][宽度][.[精确度]]{doxX}字符  以 printf 格式表示该<字符>代表的内容
            大写<字符>表示属于新的文件,小写表示属于旧的文件。<字符>的意义如下:
              F  行组中第一行的行号
              L  行组中最后一行的行号
              N  行数 ( =L-F+1 )
              E  F-1
              M  L+1
          %(A=B?T:E)  如果 A 等于 B 那么 T 否则 E
      (仅)LFMT 可包括:
          %L  该行的内容
          %l  该行的内容,但不包括结束的换行符
          %[-][宽度][.[精确度]]{doxX}n  以 printf 格式表示的输入行号
        GFMT 或 LFMT 都可包括:
          %%        %
          %c'C'     单个字符 C
          %c'OOO'  八进制码 OOO 所代表的字符
          C         字符 C(处上述转义外的其他字符代表它们自身)
    
      -d, --minimal            尽可能找出最小的差异。
          --horizon-lines=数量 保持<数量>行的一致前后缀
          --speed-large-files  假设文件十分大而且文件中含有许多微小的差异
          --color[=WHEN]       colorize the output; WHEN can be 'never', 'always',
                                 or 'auto' (the default)
          --palette=PALETTE    the colors to use when --color is active; PALETTE is
                                 a colon-separated list of terminfo capabilities
    
          --help               显示此帮助信息并退出
      -v, --version            输出版本信息并退出
    
    FILES are 'FILE1 FILE2' or 'DIR1 DIR2' or 'DIR FILE' or 'FILE DIR'.
    如果使用 --from-file 或 --to-file 选项,<文件名> 的格式则不受限制。
    如果 FILE 是 “-”,则由标准输入读取内容。
    如果输入相同,则退出状态为 0;1 表示输入不同;2 表示有错误产生。
    
    • 显示了两个文件的不同之处
    [20:38:55 root@C8-3-55 ~]#diff passwd.bak1 passwd.bak2
    139a140
    > VRkQaIfhKJ
     文件尾没有换行符
    
    • 使用 -u 参数显示详细的区别
    [20:39:46 root@C8-3-55 ~]#diff  -u passwd.bak1 passwd.bak2
    --- passwd.bak1 2021-03-07 09:20:50.693195530 -0500
    +++ passwd.bak2 2021-03-07 09:21:12.219262652 -0500
    @@ -137,3 +137,4 @@
     user98:x:8988:8988::/home/user98:/bin/bash
     user99:x:8989:8989::/home/user99:/bin/bash
     user100:x:8990:8990::/home/user100:/bin/bash
    +VRkQaIfhKJ
     文件尾没有换行符
    

    利用diff命令保存两文件的不同,从而通过一个文件重新生成另一个文件

    [20:39:46 root@C8-3-55 ~]#diff  -u passwd.bak1 passwd.bak2
    --- passwd.bak1 2021-03-07 09:20:50.693195530 -0500
    +++ passwd.bak2 2021-03-07 09:21:12.219262652 -0500
    @@ -137,3 +137,4 @@
     user98:x:8988:8988::/home/user98:/bin/bash
     user99:x:8989:8989::/home/user99:/bin/bash
     user100:x:8990:8990::/home/user100:/bin/bash
    +VRkQaIfhKJ
     文件尾没有换行符
    [20:40:52 root@C8-3-55 ~]#diff passwd.bak1 passwd.bak2 >pwd.patch # 比较两个文件的不同并将结果输出到文件
    [20:45:29 root@C8-3-55 ~]#rm -f passwd.bak2 # 删掉bak2
    [20:45:46 root@C8-3-55 ~]#patch -b passwd.bak1 pwd.patch # 使用patch -b命令配合之前生成的差异文件pwd.patch修补passed.bak1
    patching file passwd.bak1 ## 显示修补完成
    
    [20:49:03 root@C8-3-55 ~]#diff -u passwd.bak1 passwd.bak1.orig # 查看修补完成文件和备份文件差异,orig为自动生成
    --- passwd.bak1 2021-03-07 20:47:47.749139284 -0500 ## 生成的passwd.bak1为原来的passwd.bak2
    +++ passwd.bak1.orig    2021-03-07 09:20:50.693195530 -0500  ## 生成的passwd.bak1.orig 为原来的passwd.bak1
    @@ -137,4 +137,3 @@
     user98:x:8988:8988::/home/user98:/bin/bash
     user99:x:8989:8989::/home/user99:/bin/bash
     user100:x:8990:8990::/home/user100:/bin/bash
    -VRkQaIfhKJ
     文件尾没有换行符
    
    [20:49:41 root@C8-3-55 ~]#diff -u passwd.bak1.orig passwd.bak1 ## 和之前比较bak1和bak2的结果一直
    --- passwd.bak1.orig    2021-03-07 09:20:50.693195530 -0500
    +++ passwd.bak1 2021-03-07 20:47:47.749139284 -0500
    @@ -137,3 +137,4 @@
     user98:x:8988:8988::/home/user98:/bin/bash
     user99:x:8989:8989::/home/user99:/bin/bash
     user100:x:8990:8990::/home/user100:/bin/bash
    +VRkQaIfhKJ
     文件尾没有换行符
    

    patch

    复制在其他文件中进行的变更,可以理解为按照差异文件来修补一个文件变成另一个文件

    [20:34:37 root@C8-3-55 ~]#patch --help
    Usage: patch [OPTION]... [ORIGFILE [PATCHFILE]]
    
    Input options:
    
      -p NUM  --strip=NUM  Strip NUM leading components from file names.
      -F LINES  --fuzz LINES  Set the fuzz factor to LINES for inexact matching.
      -l  --ignore-whitespace  Ignore white space changes between patch and input.
    
      -c  --context  Interpret the patch as a context difference.
      -e  --ed  Interpret the patch as an ed script.
      -n  --normal  Interpret the patch as a normal difference.
      -u  --unified  Interpret the patch as a unified difference.
    
      -N  --forward  Ignore patches that appear to be reversed or already applied.
      -R  --reverse  Assume patches were created with old and new files swapped.
    
      -i PATCHFILE  --input=PATCHFILE  Read patch from PATCHFILE instead of stdin.
    
    Output options:
    
      -o FILE  --output=FILE  Output patched files to FILE.
      -r FILE  --reject-file=FILE  Output rejects to FILE.
    
      -D NAME  --ifdef=NAME  Make merged if-then-else output using NAME.
      --merge  Merge using conflict markers instead of creating reject files.
      -E  --remove-empty-files  Remove output files that are empty after patching.
    
      -Z  --set-utc  Set times of patched files, assuming diff uses UTC (GMT).
      -T  --set-time  Likewise, assuming local time.
    
      --quoting-style=WORD   output file names using quoting style WORD.
        Valid WORDs are: literal, shell, shell-always, c, escape.
        Default is taken from QUOTING_STYLE env variable, or 'shell' if unset.
    
    Backup and version control options:
    
      -b  --backup  Back up the original contents of each file.
      --backup-if-mismatch  Back up if the patch does not match exactly.
      --no-backup-if-mismatch  Back up mismatches only if otherwise requested.
    
      -V STYLE  --version-control=STYLE  Use STYLE version control.
            STYLE is either 'simple', 'numbered', or 'existing'.
      -B PREFIX  --prefix=PREFIX  Prepend PREFIX to backup file names.
      -Y PREFIX  --basename-prefix=PREFIX  Prepend PREFIX to backup file basenames.
      -z SUFFIX  --suffix=SUFFIX  Append SUFFIX to backup file names.
    
      -g NUM  --get=NUM  Get files from RCS etc. if positive; ask if negative.
    
    Miscellaneous options:
    
      -t  --batch  Ask no questions; skip bad-Prereq patches; assume reversed.
      -f  --force  Like -t, but ignore bad-Prereq patches, and assume unreversed.
      -s  --quiet  --silent  Work silently unless an error occurs.
      --verbose  Output extra information about the work being done.
      --dry-run  Do not actually change any files; just print what would happen.
      --posix  Conform to the POSIX standard.
    
      -d DIR  --directory=DIR  Change the working directory to DIR first.
      --reject-format=FORMAT  Create 'context' or 'unified' rejects.
      --binary  Read and write data in binary mode.
      --read-only=BEHAVIOR  How to handle read-only input files: 'ignore' that they
                            are read-only, 'warn' (default), or 'fail'.
    
      -v  --version  Output version info.
      --help  Output this help.
    
    Report bugs to <bug-patch@gnu.org>.
    

    vimdiff

    vimdiff通过双窗口显示,可以直观的比较两个文件

    • vimdiff其实是vim的软链接
    [21:06:31 root@C8-3-55 ~]#ll `which vimdiff`
    lrwxrwxrwx. 1 root root 3 11月 11 2019 /usr/bin/vimdiff -> vim
    
    • vimdiff等同于 vim -d
    [20:35:37 root@C8-3-55 ~]#vimdiff --help
    VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Nov 11 2019 19:08:24)
    
    用法: vim [参数] [文件 ..]       编辑指定的文件
      或: vim [参数] -               从标准输入(stdin)读取文本
      或: vim [参数] -t tag          编辑 tag 定义处的文件
      或: vim [参数] -q [errorfile]  编辑第一个出错处的文件
    
    参数:
       --                   在这以后只有文件名
       -v                   Vi 模式 (同 "vi")
       -e                   Ex 模式 (同 "ex")
       -E                   Improved Ex mode
       -s                   安静(批处理)模式 (只能与 "ex" 一起使用)
       -d                   Diff 模式 (同 "vimdiff")
       -y                   容易模式 (同 "evim",无模式)
       -R                   只读模式 (同 "view")
       -Z                   限制模式 (同 "rvim")
       -m                   不可修改(写入文件)
       -M                   文本不可修改
       -b                   二进制模式
       -l                   Lisp 模式
       -C                   兼容传统的 Vi: 'compatible'
       -N                   不完全兼容传统的 Vi: 'nocompatible'
       -V[N][fname]         Be verbose [level N] [log messages to fname]
       -D                   调试模式
       -n                   不使用交换文件,只使用内存
       -r                   列出交换文件并退出
       -r (跟文件名)                恢复崩溃的会话
       -L                   同 -r
       -A                   以 Arabic 模式启动
       -H                   以 Hebrew 模式启动
       -F                   以 Farsi 模式启动
       -T <terminal>        设定终端类型为 <terminal>
       --not-a-term         Skip warning for input/output not being a terminal
       --ttyfail            Exit if input or output is not a terminal
       -u <vimrc>           使用 <vimrc> 替代任何 .vimrc
       --noplugin           不加载 plugin 脚本
       -P[N]                打开 N 个标签页 (默认值: 每个文件一个)
       -o[N]                打开 N 个窗口 (默认值: 每个文件一个)
       -O[N]                同 -o 但垂直分割
       +                    启动后跳到文件末尾
       +<lnum>              启动后跳到第 <lnum> 行
       --cmd <command>      加载任何 vimrc 文件前执行 <command>
       -c <command>         加载第一个文件后执行 <command>
       -S <session>         加载第一个文件后执行文件 <session>
       -s <scriptin>        从文件 <scriptin> 读入正常模式的命令
       -w <scriptout>       将所有输入的命令追加到文件 <scriptout>
       -W <scriptout>       将所有输入的命令写入到文件 <scriptout>
       -x                   编辑加密的文件
       --startuptime <file> Write startup timing messages to <file>
       -i <viminfo>         使用 <viminfo> 取代 .viminfo
       --clean              'nocompatible', Vim defaults, no plugins, no viminfo
       -h  或  --help       打印帮助(本信息)并退出
       --version            打印版本信息并退出
    

    cmp

    cmp可以用来比较两个二进制文件

    [21:12:34 root@C8-3-55 ~]#cmp --help
    用法: cmp [选项]... 文件1 [文件2 [跳1 [跳2]]]
    逐字节比较两个文件。
    
    <跳1> 和 <跳2> 分别是每个文件要略过的字节数。
    
    长选项的必需参数也是相应短选项的必需参数。
      -b  --print-bytes          打印出内容相异的字节
      -i, --ignore-initial=SKIP         两个输入内容都略过前 SKIP 字节
      -i, --ignore-initial=跳1:跳2      略过 <文件1> 的前 <跳1> 个字节和文件 <文件2>
                                        的前 <跳2> 个字节。
      -l, --verbose              输出所有相异字节的字节数和内容
      -n, --bytes=限制           最多比较 <限制> 个字节
      -s, --quiet, --silent      suppress all normal output
          --help                 显示此帮助信息并退出
      -v, --version              输出版本信息并退出
    
    <跳> 值可以加上以下的单位:
    kB=1,000、K=1,024、MB=1,000,000、M=1,048,576、GB=1,000,000,000、G=107,374,182,
    还有 T、P、E、Z、Y,如此类推。
    
    如果文件是 “-” 或没给出,则从标准输入读入内容。
    如果输入相同,则退出状态为 0;1 表示输入不同;2 表示有错误产生。
    

    ls和dir功能相同,但本质有何区别呢?

    [21:15:24 root@C8-3-55 ~]#ll `which dir`
    -rwxr-xr-x. 1 root root 166448 5月  11 2019 /usr/bin/dir
    [21:16:22 root@C8-3-55 ~]#ll /bin/ls
    -rwxr-xr-x. 1 root root 166448 5月  11 2019 /bin/ls
    [21:16:29 root@C8-3-55 ~]#cmp /usr/bin/dir /bin/ls  ## 比较两个程序的二进制文件的区别
    /usr/bin/dir /bin/ls 不同:第 737 字节,第 2 行 ## 比较结果提示只有一小丢丢区别
    [21:18:21 root@C8-3-55 ~]#hexdump -s 730 -Cn 10 /usr/bin/dir ## 通过hexdump 查看dir二进制文件从730开始往后10行
    000002da  00 00 47 4e 55 00 b0 4b  be 05                    |..GNU..K..|
    000002e4
    [21:19:08 root@C8-3-55 ~]#hexdump -s 730 -Cn 10 /bin/ls## 通过hexdump 查看ls二进制文件从730开始往后10行
    000002da  00 00 47 4e 55 00 93 77  08 96                    |..GNU..w..|
    000002e4
    
    * * * 胖并快乐着的死肥宅 * * *
  • 相关阅读:
    爬虫框架概述
    Django【进阶篇 】
    Django【基础篇】
    【tornado】系列项目(二)基于领域驱动模型的区域后台管理+前端easyui实现
    刷题记录:[安洵杯 2019]easy_serialize_php
    刷题记录:[SWPU2019]Web1
    2019-2020-1 20175210 20175211 20175219 实验五 通讯协议设计
    2019-2020-1 20175210 20175211 20175219 实验三 实时系统
    2019-2020-1 20175210 20175211 20175219 实验四 外设驱动程序设计
    2019-2020-1 20175210 20175211 20175219 实验二 固件程序设计
  • 原文地址:https://www.cnblogs.com/bpzblog/p/14498275.html
Copyright © 2020-2023  润新知