如何仅显示wget进度栏?


80

例如:

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

我怎样才能看起来像这样

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

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


1
我认为,如果不编写脚本来解析wget的输出,这是不可能的。 wget -nv是关于您将要获得的最接近的信息,它实际上并不显示进度条,下载完成后只是一个单行摘要。
cdhowie 2011年

2
wget --progress = bar:force:noscroll
Leo Gallucci,

2
curl可以下载文件并产生一个简单的进度条:echo "downloading: $file ..." && curl --progress-bar --remote-name --location "$url"
curusarn '19

Answers:


27

您可以使用以下过滤器:

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进度条开始之前立即发送的顺序。此行为可能取决于实现。


如果您至少没有wget的1.16版本,这将非常有用!
A-312

1
为防止字符编码出现错误,您必须替换%c%s来解决此问题:
A-312

@HorsSujet:我看到的是来自Unicode左右单引号。我将编辑答案以进行更改。感谢您的报告。
暂停,直到另行通知。

您还可以使用第二个函数来改进代码,使其更具可读性:pastebin.com/Ek5Wf4XK
A-312

我同意这在完整的脚本中很有用,但我认为答案没有必要。
暂停,直到另行通知。

177

使用:

wget http://somesite.com/TheFile.jpeg -q --show-progress
  • -q:关闭wget输出

  • --show-progress:强制wget显示进度条,无论其详细程度设置为什么


11
对我来说,这表明wget: unrecognized option '--show-progress'?您知道这是否仅存在于较新的wget版本中吗?
UliKöhler'15


12
两个版本之间必须有一些区别,但是要使其如广告中所述工作,对于1.19版,我还需要添加以下选项:--progress=bar:force:noscroll,以及-q--show-progress。这对于构建中的Dockerfile效果很好。
YoYo

1
正如@YoYo所提到的,不要忘记--progress=bar:force:noscroll停止生成换行符!
布伦特·浮士德

19

使用以下标志来使用:

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

最好的单线客机。我不明白为什么这不是选择的答案。
萨拉曼达

怎么force 2>&1办?wget -q --show-progress --progress=bar对我来说似乎只是屈服。
MBT

这是赢家。这不是最主要的答案,这是Stack Overflow中的一个错误。
mmla

13

您可以使用以下follow选项tail

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

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

您需要使用--progress=bar:force其他wget开关来切换dot类型。

缺点是,刷新频率不及wget刷新频率(看上去每2秒刷新一次)。该--sleep-interval的选项tail似乎只是将要的意思,但它并没有为我改变什么。


您知道为什么要切换为点型吗?一些TERM类型的问题?力为我工作-谢谢!
尼尔·麦吉尔

仅在没有目标文件名且尾部值为“ 8”的情况下,使用此命令显示进度条。wget somesite.com/TheFile.jpeg --progress=bar:force 2>&1 | tail -f -n +8
MS Arun

12

该选件--show-progress,如被别人指出的那样,是最好的选择,但也仅仅是因为GNU wget的可用1.16,看在1.16的wget值得注意的变化

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

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

wget $_PROGRESS_OPT ...

也许是时候考虑使用了curl


4

您可以使用标准选项:

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

我没有其他发行版,但这绝对不是OP所要求的,至少在Ubuntu上是如此。即,它仍然显示其他信息,但是OP要求“仅进度条” ...
Dee'Kej 2015年

2

这是另一个例子,也许会对您有所帮助

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"
}

0

这是一个解决方案,它将为您显示每个文件的点(或相应的行)。如果使用进行下载,则特别有用--recursive。这不会捕获错误,并且如果有多余的行,可能会略有偏离,但是对于许多文件的总体进度而言,这很有帮助:

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

-3

从字面上看,这不是一个答案,但是此代码段可能对某些“ 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)


2
您能解释一下这条长线的作用吗?如果您已经声明这不是“字面上的答案”,那么该行与问题有什么关系?
Nico Haase

我已经说过,这与潜在的搜索方向有关。命令行在带有参数的“ C”语言环境中运行wget,使其以适合进一步处理(关闭I / O缓冲)的方式将其进度输出到zenity的进度栏中-从而为某些用户提供了一种不错的GUI例如,下载助手。
Michael Shigorin

请添加所有解释答案本身,而不是注释部分
尼科·哈泽

那些无法从命令行中获得所有解释的人并不需要它-他们要么复制粘贴而不考虑太多,要么就跳过所有内容。那些可以的人不需要我作为口译员。就像commit diff和commit消息一样:无需在后者中重复前者,而只需重申其原因和意图。请不要要求人们做愚蠢的事情:-)
Michael Shigorin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.