如何避免wget通配符下载时创建不存在的文件
解决wget下载不存在文件时创建空文件及周数范围错误的问题
核心问题分析
- 固定写死的周数范围
{1..53}不符合实际年份的周数(比如2023年只有43周),导致大量无效请求 wget -Nc参数在目标文件不存在时,会创建空文件而非直接跳过下载
解决方案:动态计算年份最大周数,按需下载
1. 计算目标年份的实际最大周数
利用date命令获取指定年份最后一天对应的ISO周数,以此作为该年的有效最大周数:
max_week=$(date -d "$t-12-31" +%V)
注:如果你的周数计算规则是周日为一周起始,可将%V替换为%U;若以周一为起始,%V或%W均可,根据实际场景调整。
2. 修改下载逻辑,动态生成周数列表
将原固定的周数范围替换为动态生成的有效周数,同时增加文件存在性检查,彻底避免空文件生成。
修改后的完整脚本
#!/bin/bash # URL由语言、年份和年周数组合而成 # 示例URL:https://example.com/greek/2020/29.gz url=https://example.com url_suffix=.gz # 语言列表 greek=(Alpha Beta Gamma Delta) german=(Auto Haus Boot) english=(Hello) # 年份列表 year=(2019 2020 2021 2022 2023) for languages in "${greek[@]}" "${german[@]}" "${english[@]}"; do for t in "${year[@]}"; do dir="ftp/$languages/$t" # 直接创建目录(已存在则无操作) mkdir -p "$dir" # 计算当前年份的最大有效周数 max_week=$(date -d "$t-12-31" +%V) # 遍历所有有效周数,检查文件存在后再下载 for week in $(seq 1 "$max_week"); do file_url="${url}/${languages}/${t}/${week}${url_suffix}" # --spider模拟请求检查文件是否存在,静默输出 if wget --spider --quiet "$file_url"; then wget -Nc "$file_url" -P "$dir" else echo "跳过不存在的文件:$file_url" fi done done done
关键优化点说明
- 动态适配周数:自动匹配不同年份的实际周数,杜绝无效的周数请求
- 前置存在性检查:用
wget --spider提前验证文件是否存在,仅在有效时执行下载,彻底避免空文件生成 - 变量引号包裹:对所有路径、URL变量添加双引号,避免空格或特殊字符导致的解析错误
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

