shell-文件管理命令之diff

243 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第29天,点击查看活动详情 引言

好好活,做有意义的事;做有意义的事,就是好好活.

diff
  • 含义

    以逐行的方式.比较文本内容的不同之处.最新版本的diff也支持了二进制文件.

    如果指定比较的是目录.则diff会比较两个目录下相同文件名的文件.并列出不同的文件.

  • 关联

    diff程序的输出被称为patch(补丁).patch可以根据diff的输出将file1file2文件的内容更新成file3file2.切记file2文件才是比较中的基准文件.是不可以随意改变的.当然diff也是我们平时用的svngit等版本工具核心功能.

  • 语法

    diff [参数] [文件1 或 目录1] [文件2 或 目录2]

    举例

    # 表示以file2文件为基准.比较file1与file2 文件的不同
    diff file1 file2
    

    对比结果特殊字符说明

    • <: 表示第一个文件中(file1)的内容
    • >: 表示第二个文件中(file2)的内容
    • a: 表示添加 --add
    • c: 表示更改 --change
    • d: 表示删除 --delete
    • ---- 表示分割线
  • 常用参数

    参数含义
    -a-text默认逐行比较文件内容
    -b-ignore-space-change不对比空格字符
    -B-ignore-blank-lines不对比空白行
    -i-ignore-case忽略大小写
    -w-igonre-all-space忽略空格字符串
    -y-sidde-by-side以并列的形式显示文件的不同之处
    -normal-ignore-space-change不对比空格字符
    -c显示全部内容,并标注出不同
    -H--speed-large-files当文件较大的时候,可以提升比较速度
    -q--brief只显示有无差别,不做详细信息的展示
    -r--recursive比较子目录中的文件
  • 事例

    • 准备测试数据
      • newts.txt

        截屏2022-12-22 17.55.10.png

      • subtest.txt
        截屏2022-12-22 17.55.53.png

    • 最基本的对比
      diff newts.txt subtest.txt 
      # 1c1 表示newts.txt文件 第一行经过修改,变成了 subtest.txt文件第1行
      1c1
      < 我是插入数据
      ---
      > 我是测试数据
      # 3c3,6 表示newts.txt文件 第3行改成了 subtest.txt文件的第3行到6行
      3c3,6
      < Test
      \ No newline at end of file
      ---
      > aaa
      > 
      > 
      > Ffff
      

    从上面的对比结果输出.从---分割线的地方,我们就可以直观的知道.newts.txtsubtest.txt不同之处.虽然这样也可以找到不同之处在哪里,但是相对来说不够直观.

    • 并排格式输出

      diff -y newts.txt subtest.txt
      # 输出结果如下
      我是插入数据       | 我是测试数据
      初始化            初始化
      Test             \ aaa
                       >
                       >
                       > Ffff
      

      输出参数说明

      • |: 表示两个文件内容不同
      • \: 表示从这行开始就有所不同,代表多行不同
      • >: 表示只在第二个文件里有
      • <: 表示只在第一个文件里有
    • -c输出

      显示全部内容,并标注出不同

      diff newts.txt subtest.txt -c
      

      输出结果

      截屏2022-12-22 18.12.42.png 输出参数说明

      • !: 表示不同之处
      • ***1,3***: 表示文件行数