【Linux】【命令】diff

diff


|---|
| |

Descriptions


diff命令用于对比两个文件或者两个文件夹的不同之处,求基本语法如下所示:

cpp 复制代码
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的分支与主分支之间的所有文件差异;② 输出的报告应该包括哪些文件被修改、新增或删除,以及具体修改的内容;③ 生成的报告应该易于阅读,以便团队成员可以快速地识别关键信息。

实现

bash 复制代码
#!/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"

说明

  1. > 或者 >> 是将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)重定向其它输出设备(文件,打开文件操作符,或打印机等等)。

    > 是覆盖,>> 是追加。

    所以 >$diff_report 将一个空的内容以覆盖的方式写道一个文件中,就相当是于清空该文件。

  2. $?是上一条命令的返回值,或者说是命令的返回状态,0表示没有错误,其他任何值表明有错误。

  3. 使用>>的时候,echo命令指定的内容不会显示在 Terminal。所以这个脚本还可以优化,如果有差异,在 Termial 给出 rpt 的位置,如果没有差异,其实只显示结果就可以了。

  4. 如果只是想查看不同,vimdiff 其实更加方便,显示效果更好。但是 diff 可以用于脚本的编写。

相关推荐
bantinghy18 分钟前
Linux进程单例模式运行
linux·服务器·单例模式
小和尚同志1 小时前
29.4k!使用 1Panel 来管理你的服务器吧
linux·运维
帽儿山的枪手1 小时前
为什么Linux需要3种NAT地址转换?一探究竟
linux·网络协议·安全
shadon1789 天前
回答 如何通过inode client的SSLVPN登录之后,访问需要通过域名才能打开的服务
linux
小米里的大麦9 天前
014 Linux 2.6内核进程调度队列(了解)
linux·运维·驱动开发
算法练习生9 天前
Linux文件元信息完全指南:权限、链接与时间属性
linux·运维·服务器
忘了ʷºᵇₐ9 天前
Linux系统能ping通ip但无法ping通域名的解决方法
linux·服务器·tcp/ip
浩浩测试一下9 天前
渗透测试指南(CS&&MSF):Windows 与 Linux 系统中的日志与文件痕迹清理
linux·运维·windows·安全·web安全·网络安全·系统安全
敏叔V5879 天前
大模型Text2SQL之在CentOS上使用yum安装与使用MySQL
linux·mysql·centos
小生云木9 天前
Linux离线编译安装nginx
linux·运维·nginx