使用bash函数配合wget批量下载URL时如何记录失败下载链接
批量下载URL时记录失败条目的实现方法
原有脚本问题
当前使用的批量下载脚本如下,添加wget -a log参数无法生效的核心原因:-a参数仅会将wget全量运行日志(含进度、成功提示、报错等所有输出)追加写入指定文件,不会单独筛选提取失败URL;且原函数未命名、未判断命令执行状态,无法精准识别下载失败场景。
# 原脚本存在函数未命名的语法问题 function() { wget "$(echo "$1" | some command)"; } cat url | xargs -I {} bash -c 'function "{}"'
正确实现方案
通过wget进程退出码判断下载结果:wget执行成功时退出码为0,非0值即为下载失败,失败时手动将对应URL写入专门的失败日志即可。修正后的可直接使用的脚本如下:
# 定义合法命名的下载函数 download_single() { raw_url="$1" # 替换为实际使用的URL处理命令 target_url=$(echo "$raw_url" | some command) # 执行wget下载,可按需调整重试次数、超时时间 # 若需要保留wget全量运行日志,可追加 -a wget_full.log 参数 if ! wget --tries=3 --timeout=15 "$target_url"; then # 下载失败时将URL追加写入失败日志,按需选择记录原始URL或解析后的实际下载地址 echo "$raw_url" >> failed_urls.log fi } # 导出函数供xargs唤起的子进程调用 export -f download_single # 批量执行下载任务 cat url | xargs -I {} bash -c 'download_single "{}"'
可选优化
- 脚本执行完成后,所有失败URL会统一存入
failed_urls.log,后续可直接读取该列表重试失败任务 - 若需要记录失败时间,可将写入日志的命令改为
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $raw_url" >> failed_urls.log - 下载任务量较大时,可给xargs添加
-P N参数(N为自定义并发数)提升下载效率,不会影响失败日志写入准确性
内容的提问来源于stack exchange,提问作者Tathastu Pandya
相关产品推荐
相关产品推荐

