Типичный способ получить размер файла без его загрузки - это отправить запрос HTTP HEAD и надеяться, что сервер отправит размер обратно в заголовке Content-Length
. Для статических файлов, таких как файлы deb
, серверы обычно отправляют эту информацию обратно, хотя нет никакой гарантии.
Существуют различные инструменты, которые могут отправлять эти HTTP-запросы HEAD.Вот пример функции, которая делает это с помощью утилиты curl
:
get_size() { # arg: URI
curl -sI "$1" | sed -n 's/^Content-Length: \([0-9]\{1,\}\).*/\1/p'
}
Обратите внимание, что она вернет Content-Length
независимо от того, был ли запрос выполнен успешно или с ошибкой. (например, 404 Not found
, где Content-Length
будет размером сообщения об ошибке).
Альтернативы curl
включают:
wget
: wget -qSO- --max-redirect = 0 --method = HEAD "$ 1"
. Он вернется со статусом «Неуспешный выход», если запрос не будет успешным (например, для использования в сочетании с set -o pipefail
). HEAD
команда: HEAD "$ 1"
. Этот также будет сообщать об ошибках запроса, но следует перенаправлениям HTTP, и, похоже, вы не можете это отключить. Если вам нужен удобный для человека метод, вы также можете использовать lftp
, например:
$ lftp -c 'du -h http://mirror.fsf.org/trisquel/pool/main/s/sdl-net1.2/libsdl-net1.2_1.2.8-4_i386.deb'
12K /trisquel/pool/main/s/sdl-net1.2/libsdl-net1.2_1.2.8-4_i386.deb
В производных Debian размер каждого файла .deb
хранится в списке пакетов, поэтому вы можете получить его, не загружая вообще ничего.
Фактически apt-get --print-uris
дает вам информацию напрямую:
$ apt-get install nginx --print-uris -qq
Starting pkgProblemResolver with broken count: 0
Starting 2 pkgProblemResolver with broken count: 0
Done
'http://ftp.fr.debian.org/debian/pool/main/n/nginx/nginx-common_1.9.1-1_all.deb' nginx-common_1.9.1-1_all.deb 96110 MD5Sum:fc64530dcd5a4d50a36b9f2423fcf6c2
'http://ftp.fr.debian.org/debian/pool/main/n/nginx/nginx-full_1.9.1-1_amd64.deb' nginx-full_1.9.1-1_amd64.deb 471998 MD5Sum:6392f45e4e376ea3be2e60949dd80fe0
'http://ftp.fr.debian.org/debian/pool/main/n/nginx/nginx_1.9.1-1_all.deb' nginx_1.9.1-1_all.deb 75882 MD5Sum:ab5fa732657fba06544b353572967383
Третье поле - это размер файла .deb
.
Пока я занимаюсь этим, вам не нужно запускать apt-get
от имени root
, чтобы определить список пакетов для загрузки!