Linux diffstat 命令详解
1. 命令简介
diffstat 是一个用于分析和可视化 diff 命令输出结果的统计工具。它读取 diff 命令生成的补丁文件或标准输入,并生成一个简洁的柱状图或统计摘要,用以展示文件变更的规模、类型(增加 / 删除)和分布情况。该工具常用于代码审查、版本变更分析等场景,帮助开发者快速把握代码库的修改范围。
2. 语法格式
bash
运行
diffstat [选项]... [文件]...两种调用模式
管道模式(常用)将 diff 命令的输出通过管道传递给 diffstat
bash
运行
diff [diff选项] 文件1 文件2 | diffstat [diffstat选项]文件模式直接读取已保存的 diff 输出文件
bash
运行
diffstat [选项] diff_output.txt说明:
- 不指定文件时,默认从标准输入 stdin 读取
- 支持传入多个文件,自动合并所有统计结果
3. 常用选项及说明
表格
| 选项 | 说明 |
|---|---|
| -c | 添加 C 语言注释前缀/* */,可嵌入源码 |
| -e | 将输出重定向到标准错误 stderr |
| -f <格式> | 设置输出格式:0 = 精简摘要、1 = 单行柱状、2 = 详细柱状、4=± 符号显示 |
| -h | 查看简短帮助信息 |
| -k | 合并文件名相同前缀,简化展示 |
| -l | 仅列出变更文件名,不显示统计图表 |
| -m | 将插入 / 删除合并统计为 “修改” 总数 |
| -n <长度> | 设置文件名字段最小显示宽度 |
| -p <长度> | 控制带路径文件名的显示宽度 |
| -r <0-2> | 重命名检测级别:0 关闭、1 基础、2 积极 |
| -s | 仅输出总计摘要,不展示单文件详情 |
| -S <源> | 指定项目根目录,适配 git 子模块统计 |
| -t | 纯文本表格输出,不绘制柱状图 |
| -u | 隐藏输出中的文件名 |
| -v / -V | 查看 diffstat 版本信息 |
| -w <宽度> | 设置输出图形总宽度(默认 80 列) |
4. 示例用法
4.1 基础用法:对比目录并统计差异
bash
运行
diff -u old_directory/ new_directory/ | diffstat输出示例:
plaintext
file1.c | 5 ++++- file2.h | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-)4.2 详细图形化输出
bash
运行
diff -u original.c modified.c | diffstat -f 2输出示例:
plaintext
original.c | 12 ++++++++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)4.3 读取本地 diff 补丁文件
bash
运行
diffstat -f 1 changes.diff4.4 结合 Git 进行代码变更统计
bash
运行
# 统计未暂存变更 git diff --stat | diffstat -f 1 # 统计两次提交差异 git diff HEAD~1 HEAD | diffstat # 分支对比 + 表格输出 git diff branchA..branchB | diffstat -t4.5 自定义输出宽度与文件名长度
bash
运行
diff -uR old/ new/ | diffstat -w 100 -n 504.6 仅快速列出变更文件
bash
运行
git show --pretty="" --name-only HEAD | diffstat -l5. 注意事项
输入格式要求优先解析统一差异格式(diff -u /git diff),普通 diff 格式可能解析异常。
二进制文件处理可识别 diff 中的二进制文件标记,但不统计行数,仅统计文本文件变更。
重命名识别规则默认将删文件 + 增文件视为两次变更;
-r 2可智能识别重命名,合并为一次修改。性能限制超大 diff(上万文件)会消耗较多资源,建议先过滤文件再统计。
