Linux - Shell - diff
-
概述
- linux diff 命令
-
背景
- 一个 比较文本差异 的工具
- 老实说, 之前 git/gitlab 上比较代码差异, 我是有点懵逼的
- diff 命令, 可以作为理解这些东西的基础
- diff 命令很实用
- 支持多种比较对象
- 文本
- 目录
- 标准输入
- 今天只讲文本, 因为其他的还不会
- 支持多种比较对象
- diff 命令很实用
- 学会了, 可以有很多场景, 稳赚不赔啊
- diff
- vimdiff
- git
- gitlab
- svn
-
环境
- os
- centos7
- os
-
思路
- 基础的比较
- 命令怎么用
- 命令结果
- 慢慢的拓展
- 各个参数的使用
- 总结
- 参数
- 基础的比较
1. 基础: 最简命令与参数
-
概述
- 简述 diff 的基本思路
-
思路
-
两个参数
- 作为一个 用来比较 的命令, 通常会需要 两个对象
- 比如各种广告
- 植发前, 植发后, 效果一下, 就出来了
- 比如各种广告
- 作为一个 用来比较 的命令, 通常会需要 两个对象
-
参照
- 找不同
- 比较的目的, 肯定是为了 找不同
- 这个还是比较简单, 只要把不同的地方圈出来, 就可以了
- 描述不同
- 如果想要比较清晰的描述不同, 那么就需要一个参照
- 植发广告的参照, 大家默认都是 植发前
- 你看那个秃子, 植发了之后, 多了多少头发
- 植发前, 就是基准
- 这样的结果, 就是描述起来, 会清晰很多
- 植发广告的参照, 大家默认都是 植发前
- 如果想要比较清晰的描述不同, 那么就需要一个参照
- diff
- 参数
- 文本1
- 参照
- 文本2
- 变化
- 以 文本1 为基础
- 所有的不同和变化, 都作为 文本1的变化 为准来描述
- 变化
- 文本1
- 参数
- 找不同
-
-
命令
-
格式
# doc1 是基准 # doc2 是相对 doc1 的变化 > diff [-option] <doc1> <doc2>
-
2. 场景1: 两个文本一模一样
-
概述
- 场景, 没有变化
-
命令
# 1. 假设文本叫 note > diff note note
-
结果
- 不会有任何输出
- 这是一个简单但又必须知道的场景
- 如果不信, 可以在 参数前加上 -y 的选项
- 不会有任何输出
3. 场景2: 变化 - 变化
-
概述
- 比较简单的变化
-
文本
-
note1
1 2 3 4 5 6 7 8 9 0
-
note2
10 2 30 40 50 6 70 71 72 8 90
-
-
命令
> diff note1 note2
-
结果
# 1. 1c1: note1 的 第1行, 经过了 修改, 变成了 note2 的 第1行 1c1 # < 开头, 是 note1 的内容 < 1 # --- 华丽的分割线 --- # > 开头, 是 note2 的内容 > 10 # 2. 3,5c3,5: note1 的 3到5行, 改成了 note2 的 3到5行 3,5c3,5 < 3 < 4 < 5 --- > 30 > 40 > 50 # 3. 7c7,9: note1 的 7 行, 改成了 note2 的 7到9行 7c7,9 < 7 --- > 70 > 71 > 72 # 4. 9,10c11: note1 的 9到10行, 改成了 note2 的 11行 9,10c11 < 9 < 0 --- > 90 # 5. 还会有 左右 不对称 的 多对多, 我就不讲了, 大家应该能够理解
4. 场景3: 变化 - 添加
-
概述
- 稍微麻烦点的变化
- 主要是 不好理解
-
文本
-
note1
1 2 3 4 5
-
note2
1 10 2 3 4 40 41 42 5 51
-
-
命令
> diff note1 note2
-
结果
# 为了变成 note2, note1 的 第1行 后面, 添加了内容, 对应 note2 的 第2行 1a2 # 为了变成 note2, note2 里添加的内容 > 10 # 为了变成 note2, note1 的 第4行 后面, 添加了内容, 对应 note2 的 第6到8行 4a6,8 > 40 > 41 > 42 # 为了变成 note2, note1 的 第5行 后面, 添加了内容, 对应 note2 的 第10行 5a10 > 51
5. 场景4: 变化 - 删除
-
概述
- 稍微麻烦点的变化
- 主要是 不好理解
-
文本
- 同 场景3
-
命令
> diff note2 note1
-
结果
# 为了变成note1, note2 的 第2行 被删除了, 被删除的行, 本该在 note1 第1行 的后面 2d1 < 10 # 为了变成note1, note2 的 第6到8行 被删除了, 被删除的行, 本该在 note1 第4行 的后面 6,8d4 < 40 < 41 < 42 # 为了变成note1, note2 的 第10行 被删除了, 被删除的行, 本该在 note1 第5行 的后面 10d5 < 51
6. 场景5: 并列模式
-
概述
- 并列展示内容
-
文本
- 同 场景3
-
命令
# 还可以加 选项 -W <宽度> 来调整宽度 > diff -y note1 note2
-
结果
# | 两边有不同 1 | 10 2 2 3 | 30 4 | 40 5 | 50 6 6 7 | 70 # > 只有 note2 有的内容 > 71 > 72 8 8 9 | 90 # < 只有 note1 有的内容 0 < # 这个格式, 我稍微调整过 # 左边 note1, 右边 note2 # 1. 相同的内容, 空格隔开 1 1 # 2. > 表示, 只在 第二个文件里 存在 # 3. < 表示, 只在 第一个文件里 存在 > 10 2 2 3 3 4 4 > 40 > 41 > 42 5 5 > 51 # 4. 如果不同, 会用 | 隔开
7. 场景6: -c 输出
-
概述
- 另一种 style, 但我不知道它叫什么
-
文本
- 同 场景3
-
命令
> diff -c note1 note2
-
结果
*** note1 2020-01-12 00:32:18.418000000 +0800 --- note2 2020-01-12 00:32:24.255000000 +0800 *************** *** 1,5 **** --- 1,10 ---- 1 + 10 2 3 4 + 40 + 41 + 42 5 + 51
8. 场景7: -u 输出
-
概述
- 另一种 style, 但我不知道它叫什么
-
文本
- 同 场景3
-
命令
> diff -u note1 note2
-
结果
# 感觉并不是很友好的样子 --- note1 2020-01-12 00:32:18.418000000 +0800 +++ note2 2020-01-12 00:32:24.255000000 +0800 @@ -1,5 +1,10 @@ 1 +10 2 3 4 +40 +41 +42 5 +51
ps
-
ref
-
后续
- git diff
- vimdiff
- 其他
-
感觉
- 其实 diff 的知识点不多
- 但是为啥我两句三句, 就扯了这么长一篇?
- 但愿能成功入门吧
- 其实 diff 的知识点不多
尽量尝试解释清楚; 自己校对能力有限, 如果有错误欢迎指出