如何仅显示 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】:
您可以使用tail
的follow
选项:
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 进度条? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
JAVAFX ProgressBar ,如何让进度条上显示百分比啊,而且是缓慢的递增的那种