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

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

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

в сценарии оболочки?

62
задан 21 December 2010 в 12:38

9 ответов

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

curl -s https://code.jquery.com/jquery-3.1.1.min.js | wc -c
3
ответ дан 31 October 2019 в 13:48

Я думаю самый легкий способ сделать, это было бы к:

  1. ЗАВИХРЕНИЕ использования для выполнения в "тихом" режиме -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
ответ дан 31 October 2019 в 13:48

У меня есть функция оболочки, на основе ответ 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
ответ дан 31 October 2019 в 13:48

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

-1
ответ дан 31 October 2019 в 13:48

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

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

$ 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

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

-1
ответ дан 31 October 2019 в 13:48

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

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

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

-4
ответ дан 31 October 2019 в 13:48

Объединить все вышеупомянутое для меня работы:

URL="http://cdimage.debian.org/debian-cd/current/i386/iso-dvd/debian-9.5.0-i386-DVD-1.iso"
curl --head --silent --location "$URL" | grep -i "content-length:" | tr -d " \t" | cut -d ':' -f 2

Это возвратит просто длину содержания в байтах:

3767500800
0
ответ дан 31 October 2019 в 13:48

Два протеста к другим ответам:

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

кроме того, можно сделать это без grep/awk или передачи по каналу:

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
21
ответ дан 31 October 2019 в 13:48

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

5
ответ дан 31 October 2019 в 13:48

Другие вопросы по тегам:

Похожие вопросы: