Existe-t-il un moyen d'obtenir la taille d'un fichier distant tel que
http://api.twitter.com/1/statuses/public_timeline.json
dans le shell script ?
Existe-t-il un moyen d'obtenir la taille d'un fichier distant tel que
http://api.twitter.com/1/statuses/public_timeline.json
dans le shell script ?
Vous pouvez télécharger le fichier et obtenir sa taille. Mais on peut faire mieux.
Utilice bouclette pour obtenir uniquement le en-tête de réponse en utilisant le -I
option.
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 concernant les autres réponses :
Vous pouvez également le faire sans grep/awk ou piping :
curl 'http://api.twitter.com/1/statuses/public_timeline.json' --location --silent --write-out 'size_download=%{size_download}\n' --output /dev/null
Et la même demande avec la compression :
curl 'http://api.twitter.com/1/statuses/public_timeline.json' --location --silent -H 'Accept-Encoding: gzip,deflate' --write-out 'size_download=%{size_download}\n' --output /dev/null
Cela ne semble pas fonctionner avec les redirections. Cette méthode ne télécharge-t-elle pas aussi le fichier entier ?
@TomHale Je pense que vous pouvez simplement ajouter -L
à la commande pour suivre les redirections (je n'ai pas d'URL de redirection pratique à tester). Et, oui, il télécharge le fichier entier.
Si vous pouvez compter sur le serveur web que vous interrogez pour renvoyer une réponse précise. Content-Length
pour un HEAD
vous n'avez pas besoin de télécharger l'ensemble du fichier. Il suffit d'ajouter -I
à l'exemple ci-dessus pour voir comment il renvoie zéro (du moins, c'est le cas le 25 février 2019). Ma solution est plus généralisée.
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 }'
Ironiquement, l'exemple d'URL que vous avez choisi utilise des chaînes d'en-tête en minuscules. content-length
ce qui brise votre commandement. Il existe de nombreuses façons d'ignorer la casse en awk, mais celle-ci est la plus sûre : curl -sI http://api.twitter.com/1/statuses/public_timeline.json | awk '/[Cc]ontent-[Ll]ength/ { print $2 }'
...bien sûr, grep est également agréable ;)
Les réponses précédentes ne fonctionnent pas lorsqu'il y a des redirections. Par exemple, si l'on veut connaître la taille du DVD debian iso, il faut utiliser l'option --location, sinon, la taille rapportée peut être celle du DVD debian iso. 302 Moved Temporarily
le corps de la réponse, pas celui du vrai dossier.
Supposons que vous ayez 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 le curl, vous pourriez 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 l'option lwp-request
à partir du libwww-perl (sur debian). Un autre avantage qu'il présente est qu'il supprime l'option supplémentaire \r ce qui facilite le traitement ultérieur des chaînes de caractères.
Ainsi, pour récupérer la taille du DVD iso debian, on pourrait faire par exemple :
$ size=$(HEAD ${url})
$ size=${size##*Content-Length: }
$ size=${size%%[[:space:]]*}
Veuillez noter que :
Pour les autres shells, vous devrez peut-être avoir recours à sed, awk, grep et al.
utiliser cURL pour fonctionner en mode silencieux -s
,
ne tirer que les en-têtes -I
(afin d'éviter de télécharger l'ensemble du fichier)
puis faites un grep insensible à la casse -i
et retourner la seconde arg en utilisant awk $2
.
La sortie est retournée comme 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, changez l'awk en :
awk '{print $2/1024}'
ou Mégaoctets
awk '{print $2/1024/1024}'
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Quelques exemples dans cette page, en voici un pour le shell Windows script (qui peut être doublé en bash script avec quelques modifications) superuser.com/a/1007898/429721
1 votes
Et si
wget --spider
?