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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:35:23