のようなリモートファイルのサイズを取得する方法はありますか
http://api.Twitter.com/1/statuses/public_timeline.json
シェルスクリプトで?
ファイルをダウンロードして、サイズを取得できます。しかし、私たちはもっとうまくやることができます。
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
他の答えへの2つの警告:
また、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
codaddict's 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
...
そのため、libwww-Perlパッケージのlwp-request
コマンドのエイリアスであるHEAD
を使用することを好みます(on debian)。もう1つの利点は、余分な\ 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
cURLを使用してサイレントモードで実行する-s
、
ヘッダーのみをプル-I
(ファイル全体のダウンロードを避けるため)
次に、大文字と小文字を区別しないgrep -i
を実行します
そして、awk $2
を使用して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
サイズをキロバイト単位で表示する場合は、awkを次のように変更します。
awk '{print $2/1024}'
またはメガバイト
awk '{print $2/1024/1024}'
私のために上記のすべてを組み合わせるには:
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
codaddict's answer に基づいたシェル関数があります。これにより、人間が読める形式でリモートファイルのサイズが得られます。
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
} # | |
# +----------------------------------------+