如何从shell脚本获取远程文件大小?

时间:2010-12-21 09:21:43

标签: shell filesize

有没有办法获得像

这样的远程文件的大小
http://api.twitter.com/1/statuses/public_timeline.json

在shell脚本中?

11 个答案:

答案 0 :(得分:83)

您可以下载该文件并获取其大小。但我们可以做得更好。

使用curl仅使用-I选项获取response header

在响应标题中查找Content-Length:,后面跟着文件大小(以字节为单位)。

$ URL="http://api.twitter.com/1/statuses/public_timeline.json"
$ curl -sI $URL | grep -i Content-Length
Content-Length: 134

要获取大小,请使用过滤器从上面的输出中提取数字部分:

$ curl -sI $URL | grep -i Content-Length | awk '{print $2}'
134

答案 1 :(得分:19)

其他答案有两点需要注意:

  1. 有些服务器没有为HEAD请求返回正确的Content-Length,因此您可能需要完整下载。
  2. 除非您指定gzip / deflate标头,否则您可能会获得不切实际的大响应(与现代浏览器相比)。
  3. 此外,您可以在没有grep / awk或管道的情况下执行此操作:

    curl 'http://api.twitter.com/1/statuses/public_timeline.json' --silent --write-out 'size_download=%{size_download}\n' --output /dev/null
    

    与压缩相同的请求:

    curl 'http://api.twitter.com/1/statuses/public_timeline.json' --silent  -H 'Accept-Encoding: gzip,deflate' --write-out 'size_download=%{size_download}\n' --output /dev/null
    

答案 2 :(得分:7)

codaddict's answer类似,但未调用grep

curl -sI http://api.twitter.com/1/statuses/public_timeline.json | awk '/Content-Length/ { print $2 }'

答案 3 :(得分:5)

当存在重定向时,前面的答案将不起作用。例如,如果想要debian iso DVD的大小,他必须使用--location选项,否则,报告的大小可能是302 Moved Temporarily答案体的大小,而不是真实文件的大小。
假设您有以下网址:

$ url=http://cdimage.debian.org/debian-cd/8.1.0/amd64/iso-dvd/debian-8.1.0-amd64-DVD-1.iso

使用curl,您可以获得:

$ curl --head --location ${url}
HTTP/1.0 302 Moved Temporarily
...
Content-Type: text/html; charset=iso-8859-1
...

HTTP/1.0 200 OK
...
Content-Length: 3994091520
...
Content-Type: application/x-iso9660-image
...

这就是为什么我更喜欢使用HEAD,它是来自 libwww-perl 包(在debian上)的lwp-request命令的别名。它的另一个优点是它剥离了额外的 \ r 字符,这简化了后续的字符串处理。

因此,要检索debian iso DVD的大小,可以做例如:

$ size=$(HEAD ${url})
$ size=${size##*Content-Length: }
$ size=${size%%[[:space:]]*}

请注意:

  • 此方法只需要启动一个进程
  • 只能使用bash,因为使用了特殊的扩展语法

对于其他炮弹,你可能不得不求助于sed,awk,grep等......

答案 4 :(得分:3)

接受的解决方案对我不起作用,这是:

curl -s https://code.jquery.com/jquery-3.1.1.min.js | wc -c

答案 5 :(得分:3)

我认为最简单的方法是:

  1. 使用cURL以静默模式-s

  2. 运行
  3. 仅提取标题-I(以避免下载整个文件)

  4. 然后执行不区分大小写的grep -i

  5. 并使用awk $2返回第二个arg。

  6. 输出以bytes

  7. 的形式返回

    示例:

    curl -sI http://api.twitter.com/1/statuses/public_timeline.json | grep -i content-length | awk '{print $2}'
    
    //output: 52
    

    curl -sI https://code.jquery.com/jquery-3.1.1.min.js | grep -i content-length | awk '{print $2}'
    
    //output: 86709
    

    curl -sI http://download.thinkbroadband.com/1GB.zip | grep -i content-length | awk '{print $2}'
    
    //output: 1073741824
    

    显示为Kilobytes / Megabytes

    如果您想以Kilobytes显示大小,请将awk更改为:

    awk '{print $2/1024}'
    

    或兆字节

    awk '{print $2/1024/1024}'
    

答案 6 :(得分:0)

将上述所有内容合并到我的作品中:

URL="http://cdimage.debian.org/debian-cd/current/i386/iso-dvd/debian-9.5.0-i386-DVD-1.iso"
curl --head --silent --location "$URL" | grep -i "content-length:" | tr -d " \t" | cut -d ':' -f 2

这将仅返回以字节为单位的内容长度:

3767500800

答案 7 :(得分:0)

我有一个基于codaddict's answer的shell函数,它以人类可读的格式提供远程文件的大小:

        org     00100h

        mov     bx, num1
        mov     cx, 15
        mov     ax, 0
li:
        add     ax, [bx]
        add     bx, 2
        sub     cx, 1
        jnz     li

        call    prt_byte

        mov     ah, 04ch
        int     021h

num1:   dw      3, 5, 7, 9, 11, 13, 15, 17, 19, 21,23,25,27,29,31
eoln:   db      0dh, 0ah, '$'

prt_byte:
        push    ax
        push    bx
        push    dx

        cmp     ax, 100
        jl      skip_h

        push    ax

        mov     bl, 100             ; divide ax by 100.
        div     bl
        mov     ah, 0

        call    prt_digit

        mul     bl                  ; remove hundreds digit.
        mov     bx, ax
        pop     ax
        sub     ax, bx

skip_h:
        cmp     ax, 10
        jl      skip_t

        push    ax

        mov     bl, 10              ; divide ax by 10.
        div     bl
        mov     ah, 0

        call    prt_digit

        mul     bl                  ; remove tens digit.
        mov     bx, ax
        pop     ax
        sub     ax, bx

skip_t:
        call    prt_digit

        mov     dx, offset eoln
        mov     ah, 9
        int     021h

        pop     dx
        pop     bx
        pop     ax
        ret

prt_digit:
        push    ax                  ; save registers.
        push    dx

        mov     dx, ax              ; put in correct register.
        add     dx, '0'             ; turn into digit.
        mov     ah, 2               ; print.
        int     021h

        pop     dx                  ; restore registers and return.
        pop     ax
        ret

答案 8 :(得分:-1)

我使用这个([Cc]ontent-[Ll]ength:),因为我让服务器在标题响应中给出了多个Content-Length字符

curl -sI "http://someserver.com/hls/125454.ts" | grep [Cc]ontent-[Ll]ength: | awk '{ print $2 }'

Accept-Ranges: bytes Access-Control-Expose-Headers: Date, Server, Content-Type, Content-Length Server: WowzaStreamingEngine/4.5.0 Cache-Control: no-cache Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: OPTIONS, GET, POST, HEAD Access-Control-Allow-Headers: Content-Type, User-Agent, If-Modified-Since, Cache-Control, Range Date: Tue, 10 Jan 2017 01:56:08 GMT Content-Type: video/MP2T Content-Length: 666460

答案 9 :(得分:-1)

这将显示有关正在进行的下载的详细信息

您只需要指定一个如下例所示的URL。

$ curl -O -w 'We downloaded %{size_download} bytes\n' 
https://cmake.org/files/v3.8/cmake-3.8.2.tar.gz

输出

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 7328k  100 7328k    0     0   244k      0  0:00:29  0:00:29 --:--:--  365k
We downloaded 7504706 bytes
  

出于自动目的,您只需要将命令添加到您的   脚本文件。

答案 10 :(得分:-3)

不同的解决方案:

ssh userName@IP ls -s PATH | grep FILENAME | awk '{print$1}'

为您提供KB的大小