81 votes

Comment obtenir la taille d'un fichier distant à partir d'un 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 ?

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 ?

128voto

codaddict Points 154968

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

29voto

James H Points 573

Deux mises en garde concernant les autres réponses :

  1. Certains serveurs ne renvoient pas la longueur de contenu correcte pour une demande HEAD, il se peut donc que vous deviez effectuer le téléchargement complet.
  2. Vous obtiendrez probablement une réponse d'une taille irréaliste (par rapport à un navigateur moderne), à moins que vous ne spécifiiez des en-têtes gzip/deflate.

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

1 votes

Cela ne semble pas fonctionner avec les redirections. Cette méthode ne télécharge-t-elle pas aussi le fichier entier ?

1 votes

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

2 votes

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.

10voto

Johnsyweb Points 45395

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 }'

4 votes

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 ;)

3 votes

Je suppose que les en-têtes ont changé pendant les quatre années qui se sont écoulées entre ma réponse et ce commentaire :)

5voto

ncarrier Points 413

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 :

  • cette méthode nécessitera le lancement d'un seul processus
  • il ne fonctionnera qu'avec bash, à cause de la syntaxe d'expansion spéciale utilisée

Pour les autres shells, vous devrez peut-être avoir recours à sed, awk, grep et al.

5voto

smftre Points 596

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

  1. utiliser cURL pour fonctionner en mode silencieux -s ,

  2. ne tirer que les en-têtes -I (afin d'éviter de télécharger l'ensemble du fichier)

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

  4. et retourner la seconde arg en utilisant awk $2 .

  5. La sortie est retournée comme 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éga-octets

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

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.

Powered by:

X