V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
zictos
V2EX  ›  Linux

Linux 的 curl 命令如何获取下载文件的进度保存到变量或者实时保存到文件?

  •  
  •   zictos · 2021-01-05 23:48:05 +08:00 · 3425 次点击
    这是一个创建于 1416 天前的主题,其中的信息可能已经有所发展或是发生改变。
    a=`curl -o test.exe https://down.qq.com/qqweb/PCQQ/PCQQ_EXE/PCQQ2020.exe`
    echo $a

    像这样的话变量 a 是空的,根本无法获取下载速度和进度。


    其实我是要从安卓上传文件到电脑上的 ftp,试过很多方法,linux 的 ftp 命令和 python 都不太稳定(应该是安卓的问题),经常出现各种莫名其妙的问题,只有 curl 上传文件到 ftp 最稳定,并且支持断点续传,比市面上的很多 app 都稳定很多。
    之所以标题用“下载”,是因为这样描述更容易让人一眼看明白,并且两者的情况是完全类似的。
    14 条回复    2021-01-06 16:06:26 +08:00
    Phant0m
        1
    Phant0m  
       2021-01-06 00:35:36 +08:00 via iPhone
    —progress-bar
    phpfpm
        2
    phpfpm  
       2021-01-06 00:47:51 +08:00 via Android
    在执行的时候你拿不到进度。盲猜一个信号量发给 curl 可以解决
    ETiV
        3
    ETiV  
       2021-01-06 03:10:14 +08:00 via iPhone
    curl 的进度是写进 stderr 的,你这样拿到的只有 stdout

    而且只有命令执行完,a 才会有值(此时进度必然是 100%)
    你想要边上传边读进度,需要再开一个进程,写个 while true 去读

    ————
    ftp 客户端还一个 ncftp,试试这个?(虽然本质上解决不了进度读取的问题……😂)
    zictos
        4
    zictos  
    OP
       2021-01-06 03:24:08 +08:00
    @ETiV #3 搜到了这个:
    curl -s -S -n http://speedtest.fremont.linode.com/100MB-fremont.bin -o /dev/null -w "%{time_total},%{size_download},%{speed_download}\n" >> stats.log

    直接运行上面这行命令就可以在当前目录下的 stats.log 文件中看到结果。但是似乎只能保存一行,没有办法把每次刷新都追加写入到文件中。https://stackoverflow.com/questions/22467257/save-curl-download-statistics-log
    ETiV
        5
    ETiV  
       2021-01-06 06:46:28 +08:00   ❤️ 3
    既然你执意…
    curl -n http://speedtest.fremont.linode.com/100MB-fremont.bin -o /dev/null --progress-bar |& perl -015 -n -e 'print "$1\n" if (/[#]* ([\d]+)/);'

    答案来自: https://unix.stackexchange.com/questions/139990/extract-download-progress-from-curl-output

    Google 了:curl continuously report download progress,第二个结果
    ETiV
        6
    ETiV  
       2021-01-06 06:47:27 +08:00   ❤️ 1
    其中 「|&」 等价于 「 2>&1 |」
    某些 shell 可能不支持这种写法…
    Cooky
        7
    Cooky  
       2021-01-06 07:40:31 +08:00 via Android
    pycurl ?
    zictos
        8
    zictos  
    OP
       2021-01-06 07:57:42 +08:00
    @ETiV #6 试了下,如果在后面加上>>test.txt 的话好像并不是实时追加到文件中的,而是运行完了才一次性保存到文件中。
    像 ping 114.114.114.114 >> test.txt 这样的命令就可以实时保存到文件中。输入 tail -f test.txt 可以实时查看。
    zictos
        9
    zictos  
    OP
       2021-01-06 08:00:16 +08:00
    @Cooky #7 pycurl 好像比 requests 还复杂,也并不是像 curl 那样一行命令就可以了。我比较想要的 pycurl 应该是直接用字符串传入跟平常 curl 那样一模一样的命令格式
    binux
        10
    binux  
       2021-01-06 08:40:02 +08:00
    -# -N 不知道是否有效
    如果你觉得复杂那就对了,curl 就不是设计这么用的,requests 和 pycurl 都有 response handler 你自己算 progress 就好了。
    TimePPT
        11
    TimePPT  
       2021-01-06 10:35:26 +08:00
    @zictos 可以试试 python requests 实现,然后用 Python Fire 简单包成 CLI 工具 https://github.com/google/python-fire
    bruce0
        12
    bruce0  
       2021-01-06 10:40:24 +08:00
    试一下 axel 这个工具,有点像 idm 的感觉, 我在 linux 上一直用
    dorothyREN
        13
    dorothyREN  
       2021-01-06 12:38:48 +08:00
    实时计算目标文件的大小与总大小的比例
    stephCurry
        14
    stephCurry  
       2021-01-06 16:06:26 +08:00
    wget file.request > progress.txt &
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5323 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 03:38 · PVG 11:38 · LAX 19:38 · JFK 22:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.