La formule: quel est ce nombre?
total int = Somme de (physical_blocks_in_use) * physical_block_size / ls_block_size) pour chaque fichier.
Où:
ls_block_size
est une variable d'environnement arbitraire (normalement 512 ou 1024 octets) qui est librement modifiable avec l'
--block-size=<int>
indicateur activé ls
, la POSIXLY_CORRECT=1
variable d'environnement GNU (pour obtenir des unités de 512 octets) ou l' -k
indicateur pour forcer des unités de 1 Ko.
physical_block_size
est la valeur dépendante du système d'exploitation d'une interface de bloc interne, qui peut ou non être connectée au matériel sous-jacent. Cette valeur est normalement de 512b ou 1k, mais dépend complètement du système d'exploitation. Il peut être révélé par la %B
valeur sur stat
ou fstat
. Notez que cette valeur est (presque toujours) sans rapport avec le nombre de blocs physiques sur un périphérique de stockage moderne .
Pourquoi si déroutant?
Ce nombre est assez détaché de toute métrique physique ou significative. De nombreux programmeurs juniors n'ont pas eu d'expérience avec les trous de fichiers ou les liens physiques / symboliques . De plus, la documentation disponible sur ce sujet spécifique est pratiquement inexistante.
La disjonction et l'ambiguïté du terme «taille de bloc» ont été le résultat de nombreuses mesures différentes étant facilement confondues, et les niveaux relativement profonds d'abstraction tournant autour de l'accès au disque.
Exemples d'informations contradictoires: du
(ou ls -s
) vsstat
L'exécution du *
dans un dossier de projet donne les résultats suivants: (Remarque: ls -s
renvoie les mêmes résultats.)
dactyl:~/p% du *
2 check.cc
2 check.h
1 DONE
3 Makefile
3 memory.cc
5 memory.h
26 p2
4 p2.cc
2 stack.cc
14 stack.h
Total : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 blocs
Pourtant, quand on court, stat
nous voyons un ensemble différent de valeurs. L'exécution stat
dans le même répertoire donne:
dactyl:~/p% stat * --printf="%b\t(%B)\t%n: %s bytes\n"
3 (512) check.cc: 221 bytes
3 (512) check.h: 221 bytes
1 (512) DONE: 0 bytes
5 (512) Makefile: 980 bytes
6 (512) memory.cc: 2069 bytes
10 (512) memory.h: 4219 bytes
51 (512) p2: 24884 bytes
8 (512) p2.cc: 2586 bytes
3 (512) stack.cc: 334 bytes
28 (512) stack.h: 13028 bytes
Total: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 blocs
Remarque: vous pouvez utiliser la commande stat * --printf="%b\t(%B)\t%n: %s bytes\n"
> pour afficher (dans l'ordre) le nombre de blocs, (en parenthèses) la taille de ces blocs, le nom du fichier et la taille en octets, comme indiqué ci-dessus.
Il y a deux choses importantes à retenir:
stat
indique à la fois le physical_blocks_in_use
et physical_block_size
tel qu'utilisé dans la formule ci-dessus. Notez qu'il s'agit de valeurs basées sur les interfaces du système d'exploitation.
du
fournit ce qui est généralement accepté comme une estimation assez précise de l'utilisation du disque physique.
Pour référence, voici le ls -l
répertoire of ci-dessus:
dactyl:~/p% ls -l
**total 59**
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.cc
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.h
-rw-r--r--. 1 dhs217 grad 0 Oct 16 2013 DONE
-rw-r--r--. 1 dhs217 grad 980 Oct 16 2013 Makefile
-rw-r--r--. 1 dhs217 grad 2069 Oct 16 2013 memory.cc
-rw-r--r--. 1 dhs217 grad 4219 Oct 16 2013 memory.h
-rwxr-xr-x. 1 dhs217 grad 24884 Oct 18 2013 p2
-rw-r--r--. 1 dhs217 grad 2586 Oct 16 2013 p2.cc
-rw-r--r--. 1 dhs217 grad 334 Oct 16 2013 stack.cc
-rw-r--r--. 1 dhs217 grad 13028 Oct 16 2013 stack.h
man ls
sur mon système ne mentionne pas cette ligne, mais leinfo coreutils ls
fait. Comment se fait-ilman ls
etinfo coreutils ls
avoir des informations différentes sur la même commande? Pourquoi n'est-il pasls
documenté une seule fois? Avoir deux documentations différentes pour la même commande semble être un échec.