stat -c "%y" 是获取文件修改时间 unix 时间戳(秒级)的正确写法,输出纯数字,适用于脚本自动化判断;gnu 用 -c,macos 用 -f "%m";%y 表示 mtime,非 %x 或 %z。

Linux 中 stat 命令本身不支持 -C 选项(该选项并不存在),stat -c "%Y" 才是获取文件修改时间 Unix 时间戳的正确写法。%Y 输出的是自 Unix 纪元(1970-01-01 00:00:00 UTC)以来的秒数,整型,适合用于脚本判断、触发部署等自动化逻辑。
确认 stat -c "%Y" 的用法和输出
stat -c "%Y" filename 返回的是文件最后一次修改时间对应的 Unix 时间戳(秒级)。注意:
- 不同系统(如 GNU coreutils vs BSD/macOS)语法略有差异:GNU Linux 用
-c,macOS 的stat需用-f "%m"(对应秒级修改时间); - %Y 是“修改时间(mtime)”,不是访问时间(%X)或状态变更时间(%Z);
- 输出无换行、无单位、无空格,纯数字,可直接参与算术比较。
在 Bash 脚本中捕获并判断时间戳
例如,检测某个构建产物(如 dist/app.js)是否比上次部署记录更新,再决定是否执行部署:
#!/bin/bash DEPLOY_FLAG="/var/run/last_deploy_ts" APP_FILE="dist/app.js" <p>if [[ ! -f "$APP_FILE" ]]; then echo "App file missing, aborting." exit 1 fi</p><p>CURRENT_TS=$(stat -c "%Y" "$APP_FILE") LAST_DEPLOY_TS=0</p><p>if [[ -f "$DEPLOY_FLAG" ]]; then LAST_DEPLOY_TS=$(cat "$DEPLOY_FLAG") fi</p><p>if (( CURRENT_TS > LAST_DEPLOY_TS )); then echo "New version detected. Deploying..."</p><h1>这里插入你的部署命令,如 rsync、systemctl reload、docker-compose up -d 等</h1><p>echo "$CURRENT_TS" > "$DEPLOY_FLAG" else echo "No update since last deployment." fi </p>
结合 find + stat 实现多文件变更监控
若需监控整个目录(如源码或配置),可用 find 找出最新修改文件的时间戳:
- 获取目录下所有普通文件的最新 mtime:
find src/ -type f -printf '%T@ %p\n' 2>/dev/null | sort -n | tail -n1 | awk '{print int($1)}' - 更简洁可靠的方式(GNU find):
find src/ -type f -printf '%T@\n' 2>/dev/null | sort -n | tail -n1 | xargs printf "%.0f\n" - 该值可用于与上一次部署时间比较,避免因单个无关小文件(如 .gitignore)触发误部署。
注意事项与健壮性建议
实际生产脚本中需考虑以下细节:
- 加错误检查:
stat可能失败(权限不足、文件被删),应判断命令退出码; - 时间精度:%Y 是秒级,若文件在 1 秒内多次写入,可能漏判;需要毫秒级请改用
%y(输出含纳秒,需解析,如stat -c "%y" file | cut -d'.' -f1); - 时区无关:Unix 时间戳本身是 UTC,无需担心本地时区;
- 原子写入:部署前确保目标文件写入完成(如先写临时文件再
mv),否则stat可能读到中间状态。











