web-dev-qa-db-fra.com

Comment obtenir la taille de fichier à distance à partir d'un script Shell?

Y at-il un moyen d’obtenir la taille d’un fichier distant comme

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

en script shell?

48
seriousdev

Vous pouvez télécharger le fichier et obtenir sa taille. Mais nous pouvons faire mieux.

Utilisez curl pour n’obtenir que l’en-tête response en utilisant l’option -I.

Dans l'en-tête de la réponse, recherchez Content-Length:, qui sera suivi de la taille du fichier en octets.

$ URL="http://api.Twitter.com/1/statuses/public_timeline.json"
$ curl -sI $URL | grep -i Content-Length
Content-Length: 134

Pour obtenir la taille, utilisez un filtre pour extraire la partie numérique de la sortie ci-dessus:

$ curl -sI $URL | grep -i Content-Length | awk '{print $2}'
134
78
codaddict

Deux mises en garde aux autres réponses:

  1. Certains serveurs ne renvoient pas la longueur de contenu correcte pour une demande HEAD, vous devrez donc peut-être effectuer le téléchargement complet.
  2. Vous obtiendrez probablement une réponse irréaliste (comparée à un navigateur moderne), sauf si vous spécifiez les en-têtes gzip/deflate.

En outre, vous pouvez le faire sans grep/awk ou piping:

curl 'http://api.Twitter.com/1/statuses/public_timeline.json' --silent --write-out 'size_download=%{size_download}\n' --output /dev/null

Et la même demande avec compression:

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
16
James H

Similaire à réponse de codaddict , mais sans l'appel à grep:

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

Les réponses précédentes ne fonctionneront pas lorsqu'il y a des redirections. Par exemple, si on veut la taille du DVD iso debian, il doit utiliser l'option --location, sinon la taille indiquée peut être celle du corps de la réponse 302 Moved Temporarily, pas celle du fichier réel.
Supposons que vous avez l'URL suivante:

$ url=http://cdimage.debian.org/debian-cd/8.1.0/AMD64/iso-dvd/debian-8.1.0-AMD64-DVD-1.iso

Avec curl, vous pouvez obtenir:

$ 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
...

C'est pourquoi je préfère utiliser HEAD, qui est un alias de la commande lwp-request à partir de libwww-Perl package (sur debian). Un autre avantage est qu'il supprime les caractères supplémentaires\r , ce qui facilite le traitement ultérieur des chaînes.

Donc, pour récupérer la taille du DVD iso debian, on pourrait par exemple:

$ size=$(HEAD ${url})
$ size=${size##*Content-Length: }
$ size=${size%%[[:space:]]*}

Veuillez noter que:

  • cette méthode nécessitera le lancement d'un seul processus
  • cela fonctionnera uniquement avec bash, à cause de la syntaxe de développement spéciale utilisée

Pour les autres coquilles, vous devrez peut-être recourir à sed, awk, grep et al ..

5
ncarrier

La solution acceptée ne fonctionnait pas pour moi, c'est:

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

Je pense que le moyen le plus simple de le faire serait de:

  1. utiliser cURL pour s'exécuter en mode silencieux -s,

  2. ne tirez que les en-têtes -I (afin d'éviter de télécharger le fichier entier)

  3. puis faites un grep -i insensible à la casse

  4. et retourne le deuxième argument en utilisant awk $2.

  5. la sortie est renvoyée sous la forme bytes

Exemples:

curl -sI http://api.Twitter.com/1/statuses/public_timeline.json | grep -i content-length | awk '{print $2}'

//output: 52

ou

curl -sI https://code.jquery.com/jquery-3.1.1.min.js | grep -i content-length | awk '{print $2}'

//output: 86709

ou

curl -sI http://download.thinkbroadband.com/1GB.Zip | grep -i content-length | awk '{print $2}'

//output: 1073741824

Afficher en kilo-octets/mégaoctets

Si vous souhaitez afficher la taille en kilo-octets, modifiez le code awk en:

awk '{print $2/1024}'

ou mégaoctets

awk '{print $2/1024/1024}'
3
Andrew Odendaal

Pour combiner tout ce qui précède pour moi fonctionne:

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

Cela retournera seulement la longueur du contenu en octets:

3767500800
0
Tom Freudenberg

J'ai une fonction Shell, basée sur réponse de codaddict , qui donne la taille d'un fichier distant dans un format lisible par l'homme ainsi:

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