推荐使用 stat -c "%s" 获取精确字节数,因其直接读取 inode 的 st_size 字段、无 I/O 开销、结果准确且适合脚本集成;相比 ls -l(需解析)、du -b(块对齐偏差)、wc -c(读文件慢且不一致)更具优势。

用 stat -c "%s" 获取精确字节数,是自动化校验中推荐的做法——它直接读取 inode 中的 st_size 字段,不触发磁盘 I/O,速度快、无误差,适合脚本集成。
为什么选 stat -c "%s" 而不是其他命令
对比常见方式:
-
ls -l第五列虽显示大小,但输出含多余字段和权限信息,需额外解析,且对符号链接默认显示目标大小(非链接文件本身) -
du -b显示的是磁盘实际占用(按块对齐),例如 1234 字节文件可能返回 4096,与内容真实大小不符 -
wc -c需打开并读取整个文件,大文件耗时长,还可能因文件被写入导致读取不一致 -
stat -c "%s"仅访问元数据,毫秒级完成,结果恒为真实逻辑字节数,稳定可靠
基础用法与常见写法
标准格式为:
stat -c "%s" filename
例如:
stat -c "%s" /tmp/app-v2.1.0.tar.gz
输出纯数字,如:181238643
若文件不存在或权限不足,命令会报错并返回非零退出码,可直接用于条件判断。
在自动化脚本中安全使用
建议加上错误处理和路径检查:
- 先用
[ -f "$file" ]确保是普通文件(排除目录、设备等) - 用
2>/dev/null抑制错误提示,只关注退出状态 - 把结果赋给变量时,用命令替换并检查是否为空
示例片段:
size=$(stat -c "%s" "$file" 2>/dev/null) || { echo "获取大小失败: $file"; exit 1; }
if [ -z "$size" ] || ! [[ "$size" =~ ^[0-9]+$ ]]; then
echo "无效大小值"; exit 1;
fi
批量校验多个文件的大小
支持一次传入多个文件,stat 会逐个输出一行:
stat -c "%s" file1.bin file2.sha256 file3.sig
输出为三行纯数字。配合 paste 或数组可轻松构建成校验清单:
paste
结果类似:12345678 app-v2.1.0.bin,便于后续比对预期值。











