Bash将服务器Last-Modified时间转Epoch 实现下载判断
极简实现方案
你之前写的大量字符串逐段拆分、字段拼接的操作属于完全冗余的步骤:GNU date命令原生支持解析HTTP响应头中Last-Modified字段对应的标准GMT时间格式(符合RFC 1123规范),根本不需要手动把月份、日期、时分秒拆出来重新拼格式。
核心技巧
仅需要一步bash内置字符串截取,就能把wget抓到的整行响应头处理成可被date直接识别的格式:
- 用
${stime#*: }语法,删除字符串开头到第一个「冒号+空格」位置的所有内容,把Last-Modified: Sat, 17 Apr 2021 04:49:57 GMT直接裁剪为Sat, 17 Apr 2021 04:49:57 GMT的标准时间串。 - 把裁剪后的时间串直接传给date命令,就能一步转成Epoch时间,省掉所有繁琐的字符串替换操作。
优化后的完整脚本
#!/bin/bash # 获取本地当前Epoch时间 ctime=$(date +%s) # 抓取目标文件的Last-Modified响应头 stime=$(wget --server-response --spider http://www.server.org/news_32.mp3 2>&1 | grep -i 'Last-Modified:') # 裁掉头信息前缀,转换为服务器文件的Epoch时间存入etime etime=$(date -d "${stime#*: }" +%s) # 计算时间差(注意修正原代码的变量笔误:原代码写的eftime要替换为实际存值的etime) diff=$(( (ctime - etime) / 86400 )) echo "目标文件距上次更新已过 $diff 天"
实用补充
- 原差值计算代码里的
eftime是拼写错误,必须和前面存储文件Epoch值的etime变量名保持一致,否则会因为空值参与算术运算直接报错。 - 可以加简单的空值判断,避免目标服务器未返回Last-Modified头时脚本异常崩溃:
if [ -z "$etime" ]; then echo "未获取到服务器文件更新时间,执行默认下载逻辑" exit 1 fi - 脚本默认适配Linux环境的GNU date;如果是macOS自带的BSD date,因为对RFC格式时间的兼容度不足,可安装coreutils包,把脚本里的
date替换为gdate实现相同效果。
内容的提问来源于stack exchange,提问作者spamelli
相关产品推荐
相关产品推荐

