web-dev-qa-db-ja.com

シェルスクリプトからリモートファイルサイズを取得する方法は?

のようなリモートファイルのサイズを取得する方法はありますか

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

シェルスクリプトで?

58
seriousdev

ファイルをダウンロードして、サイズを取得できます。しかし、私たちはもっとうまくやることができます。

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
90
codaddict

他の答えへの2つの警告:

  1. 一部のサーバーは、HEADリクエストに対して正しいContent-Lengthを返さないため、完全なダウンロードが必要になる場合があります。
  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
20
James H

codaddict's answer に似ていますが、grepへの呼び出しはありません:

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

リダイレクトがある場合、上記の回答は機能しません。たとえば、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:]]*}

その点に注意してください:

  • この方法では、1つのプロセスのみを起動する必要があります
  • 特別な拡張構文が使用されているため、bashでのみ動作します

他のシェルの場合、sed、awk、grepなどに頼らなければならない場合があります。

5
ncarrier

受け入れられたソリューションは私のために働いていませんでした、これは次のとおりです:

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

これを行う最も簡単な方法は次のようになると思います:

  1. cURLを使用してサイレントモードで実行する-s

  2. ヘッダーのみをプル-I(ファイル全体のダウンロードを避けるため)

  3. 次に、大文字と小文字を区別しないgrep -iを実行します

  4. そして、awk $2を使用して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
Andrew Odendaal

私のために上記のすべてを組み合わせるには:

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
Tom Freudenberg

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
} # |                                        |
  # +----------------------------------------+
0
GDP2