有没有一种方法可以获取远程文件的大小,例如
http://api.twitter.com/1/statuses/public_timeline.json
在shell脚本?
有没有一种方法可以获取远程文件的大小,例如
http://api.twitter.com/1/statuses/public_timeline.json
在shell脚本?
wget --spider
样
Answers:
您可以下载文件并获取其大小。但是我们可以做得更好。
在响应标头中查找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
tr -d '\r'
删除。
curl -sI $URL | grep -i content-length
为了避免区分大小写,您必须-i
在grep中使用
curl -sI https://code.jquery.com/jquery-3.1.1.min.js | grep -i content-length
其他答案有两个警告:
另外,您可以在没有grep / awk或管道的情况下执行此操作:
curl 'http://api.twitter.com/1/statuses/public_timeline.json' --location --silent --write-out 'size_download=%{size_download}\n' --output /dev/null
和相同的压缩请求:
curl 'http://api.twitter.com/1/statuses/public_timeline.json' --location --silent -H 'Accept-Encoding: gzip,deflate' --write-out 'size_download=%{size_download}\n' --output /dev/null
-L
到命令中以跟随重定向(我没有方便的重定向URL来进行测试)。而且,是的,它下载了整个文件。
Content-Length
的HEAD
请求,则无需下载整个文件。只需添加-I
到上面的示例中即可查看它如何返回零(至少在2019年2月25日如此)。我的解决方案更加笼统。
与codaddict的答案类似,但没有要求grep
:
curl -sI http://api.twitter.com/1/statuses/public_timeline.json | awk '/Content-Length/ { print $2 }'
content-length
,这破坏了您的命令。有很多方法可以忽略awk中的大小写,但这是最有效的方法:curl -sI http://api.twitter.com/1/statuses/public_timeline.json | awk '/[Cc]ontent-[Ll]ength/ { print $2 }'
...当然,grep也很好;)
重定向时,上述答案无效。例如,如果要获得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:]]*}
请注意:
对于其他shell,您可能不得不求助于sed,awk,grep等。
使用cURL以静默模式运行-s
,
只拉标题-I
(以免下载整个文件)
然后执行不区分大小写的grep -i
并使用awk返回第二个arg $2
。
输出返回为 bytes
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
如果要以千字节为单位显示大小,则将awk更改为:
awk '{print $2/1024}'
或兆字节
awk '{print $2/1024/1024}'
我有一个基于codaddict的answer的shell函数,该函数因此以人类可读的格式给出了远程文件的大小:
remote_file_size () {
printf "%q" "$*" |
xargs curl -sI |
grep Content-Length |
awk '{print $2}' |
tr -d '\040\011\012\015' |
gnumfmt --to=iec-i --suffix=B # the `g' prefix on `numfmt' is only for systems
# ^ # that lack the GNU coreutils by default, i.e.,
# | # non-Linux systems
# |
# | # in other words, if you're on Linux, remove this
# | # letter `g'; if you're on BSD or Mac, install the GNU coreutils
} # | |
# +----------------------------------------+
我这样使用([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
$ 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
为了实现自动化目的,您只需将命令添加到脚本文件中。