stat -c "%s" 最可靠,因其输出纯十进制字节数、无格式干扰,适合自动化校验;而 ls -l 易受终端宽度、别名、本地化等影响导致解析错误。

直接用 stat -c "%s" 获取字节大小最可靠,它绕过符号链接、不依赖 ls 解析,适合自动化脚本做精确比对。
为什么 %s 比 ls -l 更适合微服务版本校验
ls -l 输出受终端宽度、别名、本地化(如千位分隔符)、权限字段长度影响,解析易出错;而 stat -c "%s" 严格输出纯十进制数字,无空格、无单位、无换行干扰,可直接参与 Shell 数值比较或写入 JSON/Env 变量。
例如:
-
stat -c "%s" app.jar→ 输出 12489375 -
ls -l app.jar | awk '{print $5}'→ 可能在某些环境输出 12,489,375 或因列错位取错字段
在 CI/CD 或启动脚本中安全使用 %s
需注意路径存在性、权限和符号链接行为:
- 加
-f参数可强制获取符号链接指向文件的大小(默认stat对软链返回链文件自身大小) - 用
stat -c "%s" "$FILE" 2>/dev/null捕获错误,避免脚本因文件不存在而中断 - 配合
[[ -s "$FILE" ]]先检查文件非空,再取大小,防止零字节误判为损坏
与微服务版本校验流程结合的典型用法
例如校验新部署的 JAR 是否与预期 SHA256 + Size 匹配:
- 预存校验信息:
{"sha256": "a1b2...", "size": 12489375} - 运行时获取:
ACTUAL_SIZE=$(stat -c "%s" /opt/app/app.jar 2>/dev/null) - 比对:
if [[ "$ACTUAL_SIZE" == "12489375" ]]; then echo "size OK"; else exit 1; fi - 进一步组合校验:
[[ $(sha256sum /opt/app/app.jar | cut -d' ' -f1) == "a1b2..." ]] && [[ $(stat -c "%s" /opt/app/app.jar) == "12489375" ]] || exit 1
跨平台兼容性提醒
stat -c 是 GNU coreutils 特性,在 macOS 或 BusyBox 环境不可用。若需兼容:
- Docker 容器内通常为 GNU stat,无需额外处理
- macOS 改用
stat -f "%z" - 追求最大兼容可回退到
wc -c (但会触发读取,对只读挂载或大文件略低效)











