以更紧凑的方式显示 wget 传输(同时保留错误检测功能)

以更紧凑的方式显示 wget 传输(同时保留错误检测功能)

我知道 wget 有一些显示或不显示进度条的选项。

我想以更短的方式显示 wget 传输,或者......百分比或动态的东西,但不像经典的 wget 输出那样占用那么多空间,因为我必须将它插入到已经有输出的脚本中。

我的目标是向用户显示正在下载文件,甚至可能是速度,但不会过多破坏脚本的整体外观。

重要的:我的 wget 段落位于 if then else 脚本内,因此我必须保留错误检测功能。

我的脚本有一个如下所示的块:

if wget -O filename http://someurl then
    some_action
else
    some_other_action
fi

有人可以为我提供一些带有这种改进的定制进度数据或条形的有趣示例吗?谢谢 ;)

答案1

如果您使用“点”进度输出样式,如下所示:

   500K .......... .......... .......... .......... ..........  2%  496K 91s

那么您可以将其(位于 stderr 上)通过管道传输到awk或类似的文件中,并仅打印最后 2 列中显示的“2%”字段。

wget ... --progress=dot -q --show-progress 2>&1 |
awk 'NF>2 && $(NF-2) ~ /%/{printf "\r %s",$(NF-2)} END{print "\r    "}'

这会显示一行上变化的百分比值,该值最终会被清除。


wget要保留for an的返回代码if..else,您可以通过在脚本中设置来要求 bash 使管道返回任何失败命令(而不仅仅是最右边的命令)的错误代码:

set -o pipefail

或者,您可以将所有if..else..fi代码不变地放在一个块内,并将末尾的 stderr 通过管道传输到一个信息更丰富的 awk 中,如 cas 在注释中建议的那样:

( if wget ...
  fi
  if wget ...
  fi
  if wget ...
  fi
) 2>&1 | awk '
/^Saving to:/ { fn = gensub(/^Saving to: /,"",1) }
NF>2 && $(NF-2) ~ /%/ { printf "\r%s %s",fn,$(NF-2) }
END { gsub(/./," ",fn); print "\r    " fn }'

或者为了避免丢失 stderr 上的重要错误消息,只需将每个 wget 命令上的 stderr 重定向到第三个文件描述符:

( if wget ... 2>&3
  then ... else ... fi
  if wget ... 2>&3
  then ... else ... fi
  if wget ... 2>&3
  then ... else ... fi
) 3>&1 | awk ...

相关内容