#1 Le 12/12/2017, à 14:23
- DonutMan75
[RESOLU] Bash : conversion de taille de fichier
Bonjour à tous,
je suis en train d'écrire un script pour afficher deux informations concernant un répertoire :
- sa taille, exprimée en unité facilement lisible pour un humain (ex: 124G)
- un pourcentage d'occupation par rapport à une constante précédemment définie dans le script (ex : 54%)
Comme le répertoire en question est assez gros, je souhaite ne lancer qu'une seule fois la commande du..
Voici ce que j'ai fait
S=$(du -h -s /chemin/de/mon/repertoire | awk '{print $1}')
X=$(echo $S | sed -re 's/G/*1024M/' | sed -re 's/M/*1024K/' | sed -re 's/K/*1/g')
Ratio=$((X*100/Xref))
L'option -h de du me donne ma première information.
Ensuite je travaille sur cette sortie pour convertir cela en kb et ensuite effectuer le ratio par rapport à Xref
Ce code vous paraît-t'il perfectible ? Auriez-vous fait de la même façon ?
J'ai imbriqué des sed pour tout convertir en kb, unité de ma variable Xref...
Je ne pense pas qu'il existe une commande linux permettant de convertir à la volée différents formats de taille (un peu comme date...)
SOLUTION : cette commande existe et s'appelle numfmt.
Merci d'avance pour vos retours
Donut
Dernière modification par DonutMan75 (Le 12/12/2017, à 17:39)
Hors ligne
#2 Le 12/12/2017, à 15:17
- MicP
Re : [RESOLU] Bash : conversion de taille de fichier
Bonjour DonutMan75
Peut-être comme ça :
michel@debg53sw:~$ xRefBytes=171798691840 # Comme référence, j'ai pris 160GiB (en octets)
michel@debg53sw:~$ repertoire="$HOME/Téléchargements/"
michel@debg53sw:~$
michel@debg53sw:~$ tailleBytes=$(du -sb "${repertoire}" 2>/dev/null | cut -f 1)
michel@debg53sw:~$ tailleHumRead=$(numfmt --to=iec-i --suffix=B ${tailleBytes})
michel@debg53sw:~$ taillePerCent=$(bc <<< "scale=2; ${xRefBytes} / ${tailleBytes}")
michel@debg53sw:~$
michel@debg53sw:~$ echo "${tailleHumRead} ${taillePerCent}%"
32GiB 5.16%
michel@debg53sw:~$
Si tu préfère te passer des décimales,
tu peux remplacer :
taillePerCent=$(bc <<< "scale=2; ${xRefBytes} / ${tailleBytes}")
par :
taillePerCent=$(( ${xRefBytes} / ${tailleBytes} ))
Ce qui donnera :
michel@debg53sw:~$ echo "${tailleHumRead} ${taillePerCent}%"
32GiB 5%
michel@debg53sw:~$
=======
EDIT : J'ai modifié mon message suite à la meilleure syntaxe proposée par moko138 dans son message qui suit ( Merci moko138 )
Je laisse ce message au cas où la sortie demandée était en Human Readable
Mais si il s'agissait d'obtenir une sortie en kilo octets la proposition de moko138 est bien plus simple.
Dernière modification par MicP (Le 12/12/2017, à 17:05)
Hors ligne
#3 Le 12/12/2017, à 16:10
- moko138
Re : [RESOLU] Bash : conversion de taille de fichier
S=$(du -h -s /chemin/de/mon/repertoire | awk '{print $1}')
(...) Ensuite je travaille sur cette sortie pour convertir cela en kb
Puisque tu veux des k(i)o, ne serait-ce pas plus simple de remplacer -h par -k, en partant de
du -sk /chemin/de/mon/repertoire 2>/dev/null | awk '{print $1}'
directement ?
Dernière modification par moko138 (Le 12/12/2017, à 16:12)
%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel : À la découverte de dcraw
Hors ligne
#4 Le 12/12/2017, à 17:38
- DonutMan75
Re : [RESOLU] Bash : conversion de taille de fichier
Bonjour à tous,
super MicP je ne connaissais pas du tout la commande numfmt !
Effectivement, utiliser bc permet d'avoir un réel en sortie.
Par ailleurs le calcul via $((...)) peut poser soucis si jamais j'ai une taille de 4.0K (par exemple : un répertoire vide).
moko138, en fait je veux également avoir une sortie facilement lisible par un humain. Du coup, si j'ai la sortie en ko ça peut poser problème sur des répertoires de plusieurs Go...
Merci à tous, et bonne soirée
Donut
Hors ligne
#5 Le 12/12/2017, à 20:08
- moko138
Re : [RESOLU] Bash : conversion de taille de fichier
man du
-B, --block-size=TAILLE
utiliser cette TAILLE de bloc pour l'affichage. Par exemple « -BM »
affichera les volumes en unités de 1 048 576 octets. Voir le format de
TAILLE ci-dessous
(...)
Les valeurs affichées sont exprimées dans la première unité fournie par la
TAILLE de l'option --block-size ou les variables d'environnement
DU_BLOCK_SIZE, BLOCK_SIZE ou BLOCKSIZE. Sinon, l'unité par défaut est de 1024
octets (ou 512 octets si POSIXLY_CORRECT est activé).
TAILLE peut être une des unités suivantes : KB 1000, K 1024, MB 1000*1000, M
1024*1024 et ainsi de suite pour G, T, P, E, Z, Y. Taille peut également être
un entier suivi optionnellement par l'un des suffixes ci-dessus.
Ex :
:~$ du -s -B1048576 2>/dev/null
76 .
du -s -BM 2>/dev/null
76M .
et
:~$ du -s -B1024 2>/dev/null
77148 .
:~$ du -s -k 2>/dev/null
77148 .
Ou, plus exotique, pour mesurer en multiples de 5.123.456 octets
ou tout autre nombre entier, arbitraire, d'octets :
:~$ du -s -B5123456 2>/dev/null
16 .
Ou pour mesurer en dixièmes de Gio :
du -s -B107374182 / 2>/dev/null -x media -x mnt -x D*
29 /
Par contre, chez moi :
numfmt
numfmt : commande introuvable
~$ apt-cache show numfmt*
N: Impossible de trouver le paquet numfmt*
N: Impossible de trouver de paquet correspondant à l'expression rationnelle « numfmt* »
E: Aucun paquet n'a été trouvé
C'est dans quel paquet ?
Dernière modification par moko138 (Le 12/12/2017, à 20:09)
%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel : À la découverte de dcraw
Hors ligne
#6 Le 12/12/2017, à 21:10
- pingouinux
Re : [RESOLU] Bash : conversion de taille de fichier
Bonsoir,
numfmt se trouve apparemment dans le paquet coreutils.
Hors ligne
#7 Le 13/12/2017, à 12:12
- MicP
Re : [RESOLU] Bash : conversion de taille de fichier
Bonjour
J'avais testé la présence de numfmt sur kubuntu 16.04.3 LTS
et je viens d'installer une machine virtuelle Ubuntu16.04.3 LTS
pour constater que numfmt y était aussi présent.
Dernière modification par MicP (Le 13/12/2017, à 12:13)
Hors ligne
#8 Le 13/12/2017, à 14:25
- moko138
Re : [RESOLU] Bash : conversion de taille de fichier
Merci ! (En effet ces jours-ci je tourne avec une version qui n'est plus maintenue.)
%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel : À la découverte de dcraw
Hors ligne