Есть ли способ получить размер удаленного файла, например
http://api.twitter.com/1/statuses/public_timeline.json
в оболочке script?
Есть ли способ получить размер удаленного файла, например
http://api.twitter.com/1/statuses/public_timeline.json
в оболочке script?
Вы можете загрузить файл и получить его размер. Но мы можем сделать лучше.
Используйте curl, чтобы получить только ответ с помощью параметра -I
.
В заголовке ответа найдите Content-Length:
, за которым последует размер файла в байтах.
$ URL="http://api.twitter.com/1/statuses/public_timeline.json"
$ curl -sI $URL | grep Content-Length
Content-Length: 134
Чтобы получить размер, используйте фильтр для извлечения числовой части из вышеприведенного вывода:
$ curl -sI $URL | grep Content-Length | awk '{print $2}'
134
Два оговорки к другому:
Кроме того, вы можете сделать это без grep/awk или piping:
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
Похоже на answeradict answer, но без вызова grep
:
curl -sI http://api.twitter.com/1/statuses/public_timeline.json | awk '/Content-Length/ { print $2 }'
Предыдущие ответы не будут работать, если есть перенаправления. Например, если требуется размер debian iso DVD, он должен использовать опцию --location, в противном случае размер отчета может соответствовать размеру тела ответа 302 Moved Temporarily
, а не действительного файла.
Предположим, у вас есть следующий URL:
$ 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
, который является псевдонимом команды lwp-request
из пакета libwww-perl (на debian). Еще одно преимущество заключается в том, что он разделяет лишние символы \r, что облегчает последующую обработку строк.
Итак, чтобы получить размер debian iso DVD, можно сделать, например:
$ size=$(HEAD ${url})
$ size=${size##*Content-Length: }
$ size=${size%%[[:space:]]*}
Обратите внимание:
Для других оболочек вам может потребоваться sed, awk, grep и др.
Принятое решение для меня не работает, это:
curl -s https://code.jquery.com/jquery-3.1.1.min.js | wc -c
Чтобы совместить все вышеперечисленные для меня работы:
URL="http://cdimage.debian.org/debian-cd/8.2.0/amd64/iso-dvd/debian-8.2.0-amd64-DVD-1.iso"
curl --head --location --silent "$URL" --output /dev/null --write-out '%{http_code}\n'
Это вернет только код:
200
используйте cURL для запуска в бесшумном режиме -s
,
вытащите только заголовки -I
(чтобы не загружать весь файл)
тогда сделайте регистр нечувствительным grep -I
и верните второй аргумент, используя awk $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
Если вы хотите показать размер в Kilobytes, измените awk на:
awk '{print $2/1024}'
или мегабайты
awk '{print $2/1024/1024}'
Я использую как это ([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
У меня есть функция оболочки, основанная на ответе codaddict, который дает удаленный размер файла в человеко-читаемом формате:
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
} # | |
# +----------------------------------------+
другое решение:
ssh [email protected] ls -s PATH | grep FILENAME | awk '{print$1}'
дает размер в KB