Как получить размер удаленного файла из сценария оболочки? - PullRequest
55 голосов
/ 21 декабря 2010

Есть ли способ получить размер удаленного файла, например

http://api.twitter.com/1/statuses/public_timeline.json

в скрипте оболочки?

Ответы [ 11 ]

85 голосов
/ 21 декабря 2010

Вы можете скачать файл и получить его размер.Но мы можем добиться большего.

Используйте curl , чтобы получить только заголовок ответа с использованием опции -I.

В заголовке ответа найдите 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
19 голосов
/ 30 мая 2015

Два предупреждения к другим ответам:

  1. Некоторые серверы не возвращают правильную длину содержимого для запроса HEAD, поэтому вам может потребоваться выполнить полную загрузку.
  2. Вероятно, вы получите нереально большой ответ (по сравнению с современным браузером), если вы не укажете заголовки gzip / deflate.

Также вы можете сделать это без 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
7 голосов
/ 21 декабря 2010

Аналогично ответу codaddict , но без вызова grep:

curl -sI http://api.twitter.com/1/statuses/public_timeline.json | awk '/Content-Length/ { print $2 }'
5 голосов
/ 16 июня 2015

Предыдущие ответы не будут работать при перенаправлениях.Например, если кому-то нужен размер iso DVD Debian, он должен использовать опцию --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 символов, что облегчает последующую обработку строк.

Таким образом, чтобы получить размер ISO-DVD Debian, можно сделать, например:

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

Обратите внимание, что:

  • этот метод потребует запуска только одного процесса
  • , он будет работать только с bash, поскольку используется специальный синтаксис расширения

Для других оболочек вам, возможно, придется прибегнуть к sed, awk, grep и др ..

3 голосов
/ 26 марта 2017

Я думаю, что самый простой способ сделать это:

  1. использовать cURL для запуска в бесшумном режиме -s,

  2. потяните только заголовки -I (чтобы избежать загрузки всего файла)

  3. , затем выполните grep без учета регистра -i

  4. и вернуть второй аргумент, используя awk $2.

  5. , результат будет возвращен как 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}'
3 голосов
/ 07 декабря 2016

Принятое решение не работает для меня, это:

curl -s https://code.jquery.com/jquery-3.1.1.min.js | wc -c
0 голосов
/ 31 августа 2017

У меня есть функция оболочки, основанная на ответе 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
} # |                                        |
  # +----------------------------------------+
0 голосов
/ 12 июля 2017

Это покажет вам подробную информацию о текущей загрузке

, вам просто нужно указать URL, как показано ниже.

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

output

  % 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

Для автоматизированных целей вам просто нужно добавить команду в файл сценария.

0 голосов
/ 10 января 2017

Я использую вот так ([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

0 голосов
/ 07 июля 2016

другое решение:

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

дает размер в КБ

...