You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 11:06:10