diff
- Descriptions
- Arguments
- Examples
- 直接使用diff命令
- -u 输出格式
- -c 输出格式
- 并列输出
- -s 和 -q
- 脚本示例
- 示例1:目录及文件差异
Descriptions
diff
命令用于对比两个文件或者两个文件夹的不同之处,求基本语法如下所示:
diff [OPTION]... FILES
Compare FILES line by line.【逐行对比】
FILES 可以有四种情况:① FILE1 FILE2;② DIR1 DIR2;③ DIR FILE…;④ FILE… DIR
Arguments
一些常用的参数下表所示。
参数 | 作用 |
---|---|
b | 忽略所有空白字符的差别,包括制表符和空格 |
B | 忽略空白行 |
u | 统一格式输出,这种格式提供了一种更连续、更易读的显示方式 |
c | 上下文格式输出,类似于 -u,但显示的上下文行数更多 |
i | ignore-case,不检查大小写的不同 |
r | 比较子目录中的文件 |
y | 以并列的方式显示文件的异同之处 |
w | 在使用 -y 参数时,指定栏宽 |
N | 在比较目录时,如果文件在另一个文件中不存在,则认为文件内容为空 |
q | 只报告文件是否相同,不显示具体的差异 |
s | 如果文件相同则报告,否则以普通格式输出不同之处 |
Examples
用于测试的原始文件
直接使用diff命令
只显示不同之处。
在这里,红色方框中的内容表示的是两个文件中不同之处所在的行号。例如,16c14 指的是第一个文件的 16 行和第二个文件的14行不同。
<
后面的是第一个文件(左边)中的内容,>
对应的是第二个(右边)文件中的内容。
两个文件的 4,5 行是相同的,在这里就没有显示出来。
-u 输出格式
不同之处分别显示,并使用 + 和 - 标识不同的文件内容,相同之处则只显示一次。
-c 输出格式
显示两个文件中的所有内容,不同之处用 ! 标记。
并列输出
| 表示两个文件的不同之处,< 表示后面文件比前面文件少了1行内容,> 表示后面文件比前面文件多了一行内容
-s 和 -q
(test2 和 test 相同,test_1 和 test 不相同。)
脚本示例
基于 diff 命令的一些脚本。
示例1:目录及文件差异
场景:团队中的 A 和 B 分别在自己的分支上开发新功能。当他们准备将各自的分支合并到主分支时,遇到了一些合并冲突。项目管理者要求他们提交各自分支与主分支的差异报告,以便进行代码审查和冲突解决。
任务:① 使用diff命令对比Alice和Bob的分支与主分支之间的所有文件差异;② 输出的报告应该包括哪些文件被修改、新增或删除,以及具体修改的内容;③ 生成的报告应该易于阅读,以便团队成员可以快速地识别关键信息。
实现:
#!/bin/bash
# Define work directory
main_branch_dir="/path/to/main/branch"
feaure_branch_dir="/path/to/user/branch"
diff_report="diff_report.rpt"
# clear
>$diff_report
# Compare Directory
echo "Generating diff report between feature branch and main branch..." >> $diff_report
diff -urN $main_branch_dir $feaure_branch_dir >> $diff_report
# Report Difference
if[ $? -eq 0 ];then
echo "No differences found." >> $diff_report
else
echo "Differences found. See report below for details." >> $diff_report
fi
echo "Diff report generated at: $diff_report"
说明:
-
>
或者>>
是将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)重定向其它输出设备(文件,打开文件操作符,或打印机等等)。>
是覆盖,>>
是追加。所以
>$diff_report
将一个空的内容以覆盖的方式写道一个文件中,就相当是于清空该文件。【有待确认,自己在命令行试了一项,会报错】 -
$?
是上一条命令的返回值,或者说是命令的返回状态,0表示没有错误,其他任何值表明有错误。 -
使用
>>
的时候,echo
命令指定的内容不会显示在 Terminal。所以这个脚本还可以优化,如果有差异,在 Termial 给出 rpt 的位置,如果没有差异,其实只显示结果就可以了。 -
如果只是想查看不同,
vimdiff
其实更加方便,显示效果更好。但是diff
可以用于脚本的编写。