Quel est ce «total» dans la toute première ligne après ls -l? [fermé]

131

Quelle est la totalsortie de ls -l?

    $ ls -l /etc
    total 3344
    -rw-r--r--   1 root root   15276 Oct  5  2004 a2ps.cfg
    -rw-r--r--   1 root root    2562 Oct  5  2004 a2ps-site.cfg
    drwxr-xr-x   4 root root    4096 Feb  2  2007 acpi
    -rw-r--r--   1 root root      48 Feb  8  2008 adjtime
    drwxr-xr-x   4 root root    4096 Feb  2  2007 alchemist
Sanket Sahu
la source

Réponses:

94

Vous pouvez trouver la définition de cette ligne dans la lsdocumentation de votre plateforme. Pour coreutils ls(celui que l'on trouve sur de nombreux systèmes Linux), les informations peuvent être trouvées via info coreutils ls:

Pour chaque répertoire répertorié, faites précéder les fichiers d'une ligne «total BLOCKS», où BLOCKS est l'allocation totale de disque pour tous les fichiers de ce répertoire.

Tapis
la source
14
Curieusement, man lssur mon système ne mentionne pas cette ligne, mais le info coreutils lsfait. Comment se fait-il man lset info coreutils lsavoir des informations différentes sur la même commande? Pourquoi n'est-il pas lsdocumenté une seule fois? Avoir deux documentations différentes pour la même commande semble être un échec.
HelloGoodbye
1
infoLes docs pour coreutils sont souvent plus détaillés que les pages de manuel. C'est pourquoi ils ont une note à la fin de chaque page de manuel vous référant à la section info pour plus de détails.
Mat
7
Ah. J'ai exécuté info lset cela pour donner la même sortie que info coreutils ls. Que fait l'argument coreutils?
HelloGoodbye
46

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_sizeest 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=1variable d'environnement GNU (pour obtenir des unités de 512 octets) ou l' -kindicateur pour forcer des unités de 1 Ko.
  • physical_block_sizeest 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 %Bvaleur sur statou 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 -srenvoie 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, statnous voyons un ensemble différent de valeurs. L'exécution statdans 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:

  • statindique à la fois le physical_blocks_in_useet physical_block_sizetel qu'utilisé dans la formule ci-dessus. Notez qu'il s'agit de valeurs basées sur les interfaces du système d'exploitation.
  • dufournit 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 -lré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
Don Scott
la source
26

Il s'agit du nombre total de blocs du système de fichiers, y compris les blocs indirects, utilisés par les fichiers répertoriés. Si vous exécutez ls -ssur les mêmes fichiers et additionnez les nombres rapportés, vous obtiendrez ce même nombre.

Dave Lasley
la source
Ce n'est tout simplement pas vrai. Exemple: /bin/ls -s-> total 15 2 filename 3 filename2 3 filename3 3 filename4 2 filename5 2 filename6 2 filename8 2 filename9
Don Scott
3
Je ne sais pas quel système vous êtes, mais pour moi, il est vrai. Exemple: gist.github.com/rfjakob/200f6001bf91cf801891
Jakob
@Jakob a publié une réponse complète, jetez un coup d'œil et faites-moi savoir si cela clarifie les choses.
Don Scott
Ce n'est pas vrai dans Git bash pour Windows.
thdoan
18

Juste pour mentionner - vous pouvez utiliser -h (ls -lh) pour convertir ceci dans un format lisible par l'homme.

Tsvetomir Dimitrov
la source