如何仅显示 wget 进度条? [关闭]

Posted

技术标签:

【中文标题】如何仅显示 wget 进度条? [关闭]【英文标题】:How can I show the wget progress bar only? [closed] 【发布时间】:2011-06-08 20:36:14 【问题描述】:

例如:

wget http://somesite.com/TheFile.jpeg

    downloading: TheFile.tar.gz ...
    --09:30:42--  http://somesite.com/TheFile.jpeg
               => `/home/me/Downloads/TheFile.jpeg'
    Resolving somesite.co... xxx.xxx.xxx.xxx.
    Connecting to somesite.co|xxx.xxx.xxx.xxx|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 1,614,820 (1.5M) [image/jpeg]

    25% [======>                              ] 614,424      173.62K/s    ETA 00:14

How can I get it to look like the following?

    downloading: TheFile.jpeg ...
    25% [======>                              ] 614,424      173.62K/s    ETA 00:14

我知道 curl 可以做到这一点。但是,我需要让 wget 完成这项工作。

【问题讨论】:

如果不编写脚本来解析 wget 的输出,我认为这是不可能的。 wget -nv 大约是您将获得的最接近的值,它实际上并没有显示进度条,下载完成时只是一行摘要。 wget --progress=bar:force:noscroll curl 可以下载文件并生成简单的进度条:echo "downloading: $file ..." && curl --progress-bar --remote-name --location "$url" 【参考方案1】:

用途:

wget http://somesite.com/TheFile.jpeg -q --show-progress

-q:关闭wget的输出

--show-progress:强制wget显示进度条,无论其详细级别设置为多少

【讨论】:

对我来说这显示wget: unrecognized option '--show-progress' ?你知道这是否只存在于较新的 wget 版本中吗? @UliKöhler the flag only exists since 1.16 版本之间肯定有一些差异,但要让它像宣传的那样工作,对于版本 1.19,我还需要添加以下选项:--progress=bar:force:noscroll,以及 -q 和 @ 987654330@。这对于构建中的 Dockerfile 非常有效。 正如@YoYo 提到的,不要忘记--progress=bar:force:noscroll 以阻止生成换行符!【参考方案2】:

您可以使用以下过滤器:

progressfilt ()

    local flag=false c count cr=$'\r' nl=$'\n'
    while IFS='' read -d '' -rn 1 c
    do
        if $flag
        then
            printf '%s' "$c"
        else
            if [[ $c != $cr && $c != $nl ]]
            then
                count=0
            else
                ((count++))
                if ((count > 1))
                then
                    flag=true
                fi
            fi
        fi
    done

用法:

$ wget --progress=bar:force http://somesite.com/TheFile.jpeg 2>&1 | progressfilt
100%[======================================>] 15,790      48.8K/s   in 0.3s

2011-01-13 22:09:59 (48.8 KB/s) - 'TheFile.jpeg' saved [15790/15790]

这个函数依赖于在进度条开始之前发送的0x0d0x0a0x0d0x0a0x0d序列。此行为可能取决于实现。

【讨论】:

如果您没有至少 1.16 版的 wget,这很有用! 为了防止字符编码的错误,你必须用%s替换%c来解决这个问题: @HorsSujet:我看到的是来自Unicode左右单引号的。我将编辑我的答案以进行更改。感谢您的报告。 你也可以用第二个函数改进你的代码,它更具可读性:pastebin.com/Ek5Wf4XK 我同意这在完整的脚本中很有用,但我认为没有必要回答。【参考方案3】:

使用这些标志:

wget  -q --show-progress --progress=bar:force 2>&1

【讨论】:

最好的单行。我不明白为什么它不是选择的答案。 force 2>&1 是做什么的?只是wget -q --show-progress --progress=bar 似乎对我来说产生了相同的输出。 这个是赢家。这是 Stack Overflow 中的一个错误,它不是最佳答案。 @MBT: "2>&1" 简单地结合了 stderr(通常用于错误和日志消息)和 stdout(通常用于实际结果)输出。猜猜这里没有必要,但通常在人们想要将流程的完整输出(结果和错误消息)重定向到同一目标时使用它【参考方案4】:

您可以使用tailfollow 选项:

wget somesite.com/TheFile.jpeg --progress=bar:force 2>&1 | tail -f -n +6

+6 是删除前 6 行。您的 wget 版本或您的语言可能会有所不同。

你需要使用--progress=bar:force,否则wget会切换到dot类型。

缺点是刷新频率低于 wget(看起来每 2 秒一次)。 tail--sleep-interval 选项似乎只是为了这个,但对我来说并没有任何改变。

【讨论】:

你知道为什么它会切换到点类型吗?一些 TERM 类型的问题?力量为我工作 - 谢谢! 仅用于显示进度条,没有目标文件名,尾值为“8”。 wget somesite.com/TheFile.jpeg --progress=bar:force 2>&1 | tail -f -n +8【参考方案5】:

正如其他人指出的那样,选项--show-progress 是最好的选择,但它仅在GNU wget 1.16 之后才可用,请参阅Noteworthy changes in wget 1.16。

为了安全,我们可以先检查一下--show-progress是否支持:

# set progress option accordingly
wget --help | grep -q '\--show-progress' && \
  _PROGRESS_OPT="-q --show-progress" || _PROGRESS_OPT=""

wget $_PROGRESS_OPT ...

也许是时候考虑只使用curl了。

【讨论】:

【参考方案6】:

您可以使用标准选项:

wget --progress=bar http://somesite.com/TheFile.jpeg

【讨论】:

我不关心其他发行版,但这绝对不是 OP 要求的,至少在 Ubuntu 上是这样。即,它仍然显示其他信息,但 OP 要求“仅进度条”...【参考方案7】:

这是另一个例子:

download() 
    local url=$1
    echo -n "    "
    wget --progress=dot $url 2>&1 | grep --line-buffered "%" | sed -u -e "s,\.,,g" | awk 'printf("\b\b\b\b%4s", $2)'
    echo -ne "\b\b\b\b"
    echo " DONE"

【讨论】:

【参考方案8】:

这是一个解决方案,它会为每个文件(或行,就此而言)显示一个点。如果您使用--recursive 下载,它特别有用。这不会捕获错误,并且如果有额外的行可能会稍微偏离,但对于很多文件的一般进度,它是有帮助的:

wget -r -nv https://example.com/files/ | \
    awk -v "ORS=" ' print "."; fflush();  END  print "\n" '

【讨论】:

【参考方案9】:

这不是字面上的答案,但这个 sn-p 也可能对一些来这里的人有所帮助,例如“zenity wget GUI”:

LANG=C wget -O /dev/null --progress=bar:force:noscroll --limit-rate 5k http://nightly.altlinux.org/sisyphus/ChangeLog 2>&1 | stdbuf -i0 -o0 -e0 tr '>' '\n' | stdbuf -i0 -o0 -e0 sed -rn 's/^.*\<([0-9]+)%\[.*$/\1/p' | zenity --progress --auto-close

对我来说至关重要的是stdbuf(1)

【讨论】:

你能解释一下这条长线的作用吗?如果您已经声明这“不是真正的答案”,那么该行与问题有何关系? 这与潜在的搜索方向有关,这就是我所说的;命令行在“C”语言环境中运行 wget 并带有参数,以使其以适合进一步处理(关闭 I/O 缓冲)的方式输出其进度到 zenity 的进度条 - 为某些人提供一种不错的 GUI例如下载助手。 请将所有解释添加到答案本身,而不是评论部分 你能update你的答案吗?

以上是关于如何仅显示 wget 进度条? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C# WinForm自定义进度条

SCP 进度条,如 bash 脚本中的 WGET

vc6.0里MFC进度条如何使用

JAVAFX ProgressBar ,如何让进度条上显示百分比啊,而且是缓慢的递增的那种

无法加载 ListView 的内容时如何关闭 Android 的进度条?

即使 FirebaseListAdapter 中没有要填充的视图,如何关闭进度条?