145 votes

Méthode portable pour obtenir la taille d'un fichier (en octets) dans le shell

Sous Linux, j'utilise stat --format="%s" FILE mais le Solaris La machine à laquelle j'ai accès n'a pas l'option stat commande. Que dois-je utiliser alors ?

J'écris des scripts en Bash et je ne peux pas vraiment installer de nouveaux logiciels sur le système.

J'ai déjà envisagé de l'utiliser :

perl -e '@x=stat(shift);print $x[7]' FILE

ou même :

ls -nl FILE | awk '{print $5}'

Mais aucun d'entre eux ne semble raisonnable. Perl juste pour obtenir la taille du fichier ? Ou lancer deux programmes pour faire la même chose ?

241voto

Carl Smotricz Points 36400

wc -c < filename (court pour le nombre de mots, -c imprime le nombre d'octets) est un portable, POSIX solution. Seul le format de sortie peut ne pas être uniforme sur toutes les plateformes, car certains espaces peuvent être ajoutés (ce qui est le cas pour Solaris).

N'omettez pas la redirection des entrées. Lorsque le fichier est passé comme argument, le nom du fichier est imprimé après le nombre d'octets.

J'avais peur que cela ne fonctionne pas pour les fichiers binaires, mais cela fonctionne bien sous Linux et Solaris. Vous pouvez l'essayer avec wc -c < /usr/bin/wc . De plus, les utilitaires POSIX sont garantie de traitement des fichiers binaires sauf indication contraire explicite.

50voto

fwhacking Points 131

J'ai fini par écrire mon propre programme (vraiment petit) pour afficher uniquement la taille. Vous trouverez plus d'informations dans bfsize - affiche la taille du fichier en octets (et juste ça) .

Les deux méthodes les plus propres à mon avis avec les outils Linux courants sont :

stat -c %s /usr/bin/stat

50000

wc -c < /usr/bin/wc

36912

Mais je n'ai pas envie de taper des paramètres ou de pipeter la sortie juste pour obtenir une taille de fichier, donc j'utilise mon propre système de gestion des données. bfsize .

39voto

fwhacking Points 274

Même si du imprime généralement l'utilisation du disque et non la taille réelle des données. Utilitaires de base GNU du peut imprimer la "taille apparente" d'un fichier en octets :

du -b FILE

Mais cela ne fonctionnera pas sous BSD , Solaris , macOS etc.

13voto

Finalement, j'ai décidé d'utiliser ls et l'expansion du réseau de Bash :

TEMP=( $( ls -ln FILE ) )
SIZE=${TEMP[4]}

Ce n'est pas vraiment agréable, mais au moins il ne fait qu'un seul fork+execve, et il ne dépend pas d'un langage de programmation secondaire ( Perl , Ruby , Python ou autre).

10voto

user7504315 Points 101

BSD les systèmes ont stat avec des options différentes de celles de l Utilitaires de base GNU un, mais avec des capacités similaires.

stat -f %z <file name>

Cela fonctionne sur macOS (testé sur la 10.12), FreeBSD , NetBSD y OpenBSD .

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