是否可以设置curl以在进度条之前显示文件名?

时间:2015-12-12 14:25:58

标签: macos bash curl progress-bar wget

我正在尝试在我正在开发的脚本中使用curl,它将下载一堆文件。我使用curl的-#开关强制显示进度条而不是不感兴趣的完整详细信息。但是,输出看起来像这样:

######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%

这根本不是描述性的,我想在任何下载之前添加一行来显示将要下载的内容,但我不喜欢结果。我问是否有一种方法可以让curl输出类似于我们从wget获得的东西:

file1.zip      100%[=============================>]  33.05K  --.-KB/s   in 0.1s   
file2.zip      100%[=============================>]  46.26K  --.-KB/s   in 0.1s   
file3.zip      100%[=============================>]  19.46K  --.-KB/s   in 0.1s

我不想使用wget,因为它默认情况下不适用于OS X,并且需要使用我的脚本的人首先使用端口或其他不方便的方法安装wget。

2 个答案:

答案 0 :(得分:0)

通过使用 curl-progress 脚本(https://gist.github.com/sstephenson/4587282)找到了解决此问题的好方法,该脚本使用自定义绘制的进度条包裹curl。

默认情况下,脚本 curl-progress 不会在进度条前显示文件名,但可以完全自定义。我不得不修改print_progress函数,因此它使用一个额外的参数,这是要下载的文件的名称。为此,我在print_progress中修改了printf语句,因此它在进度条之前的适当位置打印文件名:

print_progress() {
  local bytes="$1"
  local length="$2"
  local fileName="$3" # I added this third variable
  ...
  ...
  printf "\x1B[0G %-10s%-6s\x1B[7m%*s\x1B[0m%*s\x1B[1D" \
    "$fileName" "${percent}%" "$on" "" "$off" "" >&4
}

现在print_progress方法需要三个参数,为此我修改了对print_progress的调用以发送第三个参数:

print_progress "$bytes" "$length" "$2"

其中$ 2指向发送到curl-progress的第二个参数。现在,这是从Web下载任意文件的示例:

$ ./curl-progress -so "file1.zip" "http://download.thinkbroadband.com/20MB.zip"

这是输出: Output

我仍然需要发送curl-progress脚本的副本,但最好还是要求用户先安装wget。

答案 1 :(得分:0)

对于使用 curl 仅下载 1 个文件(如本线程示例中给出的文件)的特殊情况,我们可以使用这个 liner 函数。

# Usage : curlp URL
curlp(){ f=${1##*/};printf "%28s%s" "" $f;COLUMNS=27 curl -# $1 -o $f ; }

它提供了一个带有 20 # 的进度条(即每 5% 进度一个 #)。您确实可以修改它以添加更多选项,可能是 2 个参数,一个是 URL,第二个可能是本地名称,等等...