Подтвердить что ты не робот

Как получить удаленный размер файла из оболочки script?

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

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

в оболочке script?

4b9b3361

Ответ 1

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

Используйте 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

Ответ 2

Два оговорки к другому:

  • Некоторые серверы не возвращают правильный Content-Length для запроса HEAD, поэтому вам может потребоваться полная загрузка.
  • Вероятно, вы получите нереалистично большой ответ (по сравнению с современным браузером), если вы не укажете заголовки 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

Ответ 3

Похоже на answeradict answer, но без вызова grep:

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

Ответ 4

Предыдущие ответы не будут работать, если есть перенаправления. Например, если требуется размер 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:]]*}

Обратите внимание:

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

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

Ответ 5

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

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

Ответ 6

Чтобы совместить все вышеперечисленные для меня работы:

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

Ответ 7

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

  • используйте 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}'

Ответ 8

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

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

Ответ 10

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

Ответ 11

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

ssh [email protected] ls -s PATH | grep FILENAME | awk '{print$1}'

дает размер в KB