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?
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
Deux mises en garde aux autres réponses:
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
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 }'
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:
Pour les autres coquilles, vous devrez peut-être recourir à sed, awk, grep et al ..
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
utiliser cURL pour s'exécuter en mode silencieux -s
,
ne tirez que les en-têtes -I
(afin d'éviter de télécharger le fichier entier)
puis faites un grep -i
insensible à la casse
et retourne le deuxième argument en utilisant awk $2
.
la sortie est renvoyée sous la forme bytes
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
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}'
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
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
} # | |
# +----------------------------------------+