Bash脚本中递归Wget下载全局进度条实现需求
实现Wget递归下载的全局进度条
要解决递归下载时的全局进度显示问题,核心思路是先统计待下载文件总数,再跟踪每一个文件的完成状态来更新进度条,以下是具体实现方案:
步骤1:预统计待下载文件总数
先用Wget的蜘蛛模式(--spider)爬取目标链接,只遍历文件不实际下载,统计符合条件的文件数量:
target_url="https://example.com/your/directory/" # 蜘蛛模式遍历链接,过滤出每个文件的日志行并统计数量 total_files=$(wget -np -r -R "index.html*" --spider "$target_url" 2>&1 | grep -E '^--' | wc -l)
注意:如果目标目录有大量重复链接或需要更精准过滤,可以调整
grep规则,比如排除目录行(若Wget日志中目录行有特征)。如果需要跳过本地已存在的文件,记得加上-N参数,确保统计数和实际下载数一致。
步骤2:编写进度条函数
用Bash实现一个简单的文本进度条,用于实时更新全局进度:
show_global_progress() { local current=$1 local total=$2 local percent=$((current * 100 / total)) local bar_width=50 local filled_bars=$((percent * bar_width / 100)) local empty_bars=$((bar_width - filled_bars)) # 用\r实现行内刷新,避免多行输出 printf "\r[" printf "%0.s#" $(seq 1 $filled_bars) printf "%0.s-" $(seq 1 $empty_bars) printf "] %d/%d (%d%%)" "$current" "$total" "$percent" }
步骤3:下载并跟踪进度
启动Wget下载,同时捕获每个文件的完成事件,更新进度条:
completed_files=0 # 用dot模式输出下载日志,便于捕获完成事件 wget -np -r -R "index.html*" -N "$target_url" -q --progress=dot 2>&1 | while read -r log_line; do # 检测文件下载完成的日志特征(dot模式下完成时会包含"saved"关键字) if echo "$log_line" | grep -q "saved"; then completed_files=$((completed_files + 1)) show_global_progress "$completed_files" "$total_files" fi done # 下载完成后换行,避免进度条停在行首 echo -e "\n下载完成!"
可能的优化点
- 如果目标服务器支持,也可以用
curl配合find统计文件数,但Wget的蜘蛛模式更适配递归下载场景。 - 若需要更美观的进度条,可以用第三方工具
pv,但依赖额外安装,上述纯Bash方案无需额外依赖。
内容的提问来源于stack exchange,提问作者Quentin Lamamy
相关产品推荐
相关产品推荐

