如何在Bash脚本中为curl下载的文件名添加时间戳?
问题解答
1. 能否通过-O选项实现添加日期的需求?
不能直接用-O实现。-O的核心逻辑是直接复用远程服务器返回的文件名(或URL路径的最后一段),没有内置的文件名修改功能。要实现带日期的自定义文件名,必须结合-o选项,但可以先自动获取远程文件名再拼接日期,模拟-O的自动命名逻辑。
2. 添加日期对断点续传-C -的影响
只要本地文件名保持一致,断点续传功能不受影响:
curl -C -的工作原理是检查本地文件的大小,向服务器发送Range请求,从已下载的字节位置继续传输。- 若同一天内中断后重新运行脚本,生成的带日期文件名一致,curl会自动识别本地文件并续传(前提是服务器支持断点续传)。
- 若跨天重新运行,文件名的日期部分改变,curl会将其视为新文件,重新开始下载。
3. 兼容Ubuntu和BusyBox的实现方案
步骤1:自动获取远程文件名
优先从响应头的Content-Disposition字段提取文件名,若不存在则从URL路径的最后一段获取:
# 获取远程文件名 remote_filename=$(curl -s --head --location "${HEADERS[@]}" "$url" | awk -F 'filename=' '{if($2) print $2}' | tr -d '"') # 若未获取到,从URL提取 if [ -z "$remote_filename" ]; then remote_filename=$(basename "$url") fi
步骤2:拼接日期生成新文件名
拆分文件名的名称和后缀部分,添加日期后重组(兼容无后缀的文件名):
current_date=$(date +"%Y-%m-%d") # 匹配你期望的YYYY-MM-DD格式 # 处理文件名 if echo "$remote_filename" | grep -q "\."; then name_part=$(echo "$remote_filename" | cut -d. -f1) ext_part=$(echo "$remote_filename" | cut -d. -f2-) new_filename="${name_part}-${current_date}.${ext_part}" else new_filename="${remote_filename}-${current_date}" fi
步骤3:带断点续传的curl命令
用-o指定新文件名,保留原有的断点续传和其他参数:
curl --fail -S -C - --location "${HEADERS[@]}" -X GET "$url" -o "$new_filename"
4. 完整脚本示例
#!/bin/sh # 兼容bash和BusyBox sh url="你的下载URL" HEADERS=("-H" "Authorization: Bearer xxx") # 替换为你的实际请求头 # 获取远程文件名 remote_filename=$(curl -s --head --location "${HEADERS[@]}" "$url" | awk -F 'filename=' '{if($2) print $2}' | tr -d '"') if [ -z "$remote_filename" ]; then remote_filename=$(basename "$url") fi # 生成带日期的文件名 current_date=$(date +"%Y-%m-%d") if echo "$remote_filename" | grep -q "\."; then name_part=$(echo "$remote_filename" | cut -d. -f1) ext_part=$(echo "$remote_filename" | cut -d. -f2-) new_filename="${name_part}-${current_date}.${ext_part}" else new_filename="${remote_filename}-${current_date}" fi # 执行下载(带断点续传) curl --fail -S -C - --location "${HEADERS[@]}" -X GET "$url" -o "$new_filename"
内容的提问来源于stack exchange,提问作者Preeti
相关产品推荐
相关产品推荐

