如何编写Bash脚本判断文件创建时间是否在1小时以内
Bash实现:判断指定文件创建时间距当前是否不足1小时
首先提前说个容易踩的坑:并非所有文件系统都存储文件的真实创建(出生)时间,ext4、XFS、Btrfs这类现代主流文件系统支持该属性,ext3等老旧文件系统无相关记录,实现时建议加回退逻辑避免报错。
可直接用的实现脚本
这个脚本适配绝大多数使用GNU工具链的Linux发行版(Debian、Ubuntu、RHEL、CentOS等):
#!/bin/bash # 入参校验 if [ $# -ne 1 ]; then echo "调用方式: $0 <待检测文件路径>" exit 2 fi TARGET_FILE="$1" if [ ! -f "$TARGET_FILE" ]; then echo "错误:路径 $TARGET_FILE 不存在或不是常规文件" exit 2 fi # 取时间戳计算差值 CURRENT_TS=$(date +%s) # GNU stat 用%W取文件创建时间的Unix时间戳,不支持时返回0 FILE_CREATE_TS=$(stat -c "%W" "$TARGET_FILE") # 不支持创建时间读取时,回退用最后修改时间判断 if [ "$FILE_CREATE_TS" -eq 0 ]; then echo "提示:当前文件系统不支持读取文件创建时间,将使用最后修改时间做判断" FILE_CREATE_TS=$(stat -c "%Y" "$TARGET_FILE") fi DIFF_SECONDS=$((CURRENT_TS - FILE_CREATE_TS)) # 1小时对应3600秒,小于该值即符合判断 if [ $DIFF_SECONDS -lt 3600 ]; then echo "检测通过:文件 $TARGET_FILE 生成时间距当前不足1小时,已存在 $((DIFF_SECONDS/60)) 分钟" exit 0 else echo "检测不通过:文件 $TARGET_FILE 生成时间距当前已超过1小时,已存在 $((DIFF_SECONDS/3600)) 小时" exit 1 fi
实现注意事项
- 别搞混文件的三类时间属性:
- 创建时间(Birth time):文件首次写入磁盘的时间,是本需求的目标字段,GNU stat用
%W读取 - 修改时间(mtime):文件内容最后一次被修改的时间,是最稳妥的回退判断字段,用
stat -c "%Y"读取 - 状态变更时间(ctime):文件权限、属主等元数据最后变更的时间,和创建时间无关,不要用这个字段判断
- 创建时间(Birth time):文件首次写入磁盘的时间,是本需求的目标字段,GNU stat用
- 如果是macOS/BSD系统,stat的参数和GNU版本不一样,读取创建时间要替换为
stat -f "%B" "$TARGET_FILE",其余计算逻辑完全一致 - 不要用解析
ls命令输出的方式提取时间,ls的输出格式受locale、时区、alias配置影响,兼容性极差,很容易出bug - 脚本退出码做了区分:0代表文件生成时间不足1小时,1代表超过1小时,2代表入参错误/文件不存在,可以直接在cron任务、CI流程、其他shell逻辑里调用判断
调用示例:
先给脚本加执行权限:chmod +x check_file_age.sh
单独执行检测:./check_file_age.sh /path/to/your/file
嵌入其他逻辑使用:if ./check_file_age.sh /tmp/runtime_cache.lock; then echo "缓存文件仍在1小时有效期内,跳过重新生成步骤" fi
内容的提问来源于stack exchange,提问作者airdata
相关产品推荐
相关产品推荐

