是否可以将 curl 设置为在进度条之前显示文件名?
Is it possible to set curl to show file name before progress bar?
我正在尝试在我正在开发的脚本中使用 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很不方便。
我找到了解决此问题的好方法,方法是在此处使用 curl-progress 脚本 (https://gist.github.com/sstephenson/4587282),该脚本使用自定义绘制的进度条包装 curl。
默认情况下,脚本 curl-progress 不会在进度条前面显示文件名,但它是完全可定制的。我必须修改 print_progress 函数,以便它使用一个额外的参数,即要下载的文件的名称。因此,我修改了 print_progress 里面的 printf 语句,让它在进度条之前的合适位置打印文件名:
print_progress() {
local bytes=""
local length=""
local fileName="" # 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 指的是发送到 curl-progress 的第二个参数。现在这是一个从网上下载任意文件的例子:
$ ./curl-progress -so "file1.zip" "http://download.thinkbroadband.com/20MB.zip"
这是输出:
我仍然需要随附一份 curl-progress 脚本,但这比要求用户先安装 wget 要好。
对于使用 curl 仅下载 1 个文件的特殊情况,如本线程中示例中给出的那样,我们可以使用这个线性函数。
# Usage : curlp URL
curlp(){ f=${1##*/};printf "%28s%s" "" $f;COLUMNS=27 curl -# -o $f ; }
它提供了一个带有 20 # 的进度条(即每 5% 的进度一个 #)。您确实可以破解它以添加更多选项,可能是 2 个参数,一个是 URL,第二个可能是本地名称。等等...
我正在尝试在我正在开发的脚本中使用 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很不方便。
我找到了解决此问题的好方法,方法是在此处使用 curl-progress 脚本 (https://gist.github.com/sstephenson/4587282),该脚本使用自定义绘制的进度条包装 curl。
默认情况下,脚本 curl-progress 不会在进度条前面显示文件名,但它是完全可定制的。我必须修改 print_progress 函数,以便它使用一个额外的参数,即要下载的文件的名称。因此,我修改了 print_progress 里面的 printf 语句,让它在进度条之前的合适位置打印文件名:
print_progress() {
local bytes=""
local length=""
local fileName="" # 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 指的是发送到 curl-progress 的第二个参数。现在这是一个从网上下载任意文件的例子:
$ ./curl-progress -so "file1.zip" "http://download.thinkbroadband.com/20MB.zip"
这是输出:
我仍然需要随附一份 curl-progress 脚本,但这比要求用户先安装 wget 要好。
对于使用 curl 仅下载 1 个文件的特殊情况,如本线程中示例中给出的那样,我们可以使用这个线性函数。
# Usage : curlp URL
curlp(){ f=${1##*/};printf "%28s%s" "" $f;COLUMNS=27 curl -# -o $f ; }
它提供了一个带有 20 # 的进度条(即每 5% 的进度一个 #)。您确实可以破解它以添加更多选项,可能是 2 个参数,一个是 URL,第二个可能是本地名称。等等...