Qual è quel "totale" nella prima riga dopo ls -l? [chiuso]


131

Qual è totall'output di 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

Risposte:


94

Puoi trovare la definizione di quella linea nella lsdocumentazione della tua piattaforma. Per coreutils ls(quello presente su molti sistemi Linux), le informazioni possono essere trovate tramite info coreutils ls:

Per ogni directory elencata, prefigurare i file con una riga "BLOCCHI totali", dove BLOCCHI è l'allocazione totale del disco per tutti i file in quella directory.


14
Stranamente, man lssul mio sistema non menziona quella linea, ma lo info coreutils lsfa. Come mai man lse info coreutils lsavere informazioni diverse sullo stesso comando? Perché non è lssolo documentato una volta? Avere due diverse documentazioni per lo stesso comando sembra impostato per un errore.
Ciao Arrivederci

1
infoi documenti per roba coreutils sono spesso più dettagliati delle pagine man. Ecco perché hanno una nota alla fine di ogni pagina man che rimanda alla sezione informazioni per maggiori dettagli.
Mat

7
Ah. Ho eseguito info lse per dare lo stesso output di info coreutils ls. Cosa fa l'argomento coreutils?
Ciao Arrivederci

46

La formula: che cos'è quel numero?

total int = Sum of (physical_blocks_in_use) * physical_block_size / ls_block_size) per ogni file.

Dove:

  • ls_block_sizeè una variabile di ambiente arbitraria (normalmente 512 o 1024 byte) che è liberamente modificabile con il --block-size=<int>flag attivato ls, la POSIXLY_CORRECT=1variabile di ambiente GNU (per ottenere unità da 512 byte) o il -kflag per forzare unità da 1kB.
  • physical_block_sizeè il valore dipendente dal sistema operativo di un'interfaccia di blocco interna, che può o meno essere connessa all'hardware sottostante. Questo valore è normalmente 512b o 1k, ma dipende completamente dal sistema operativo. Può essere rivelato attraverso il %Bvalore su stato fstat. Si noti che questo valore è (quasi sempre) non correlato al numero di blocchi fisici su un dispositivo di archiviazione moderno .

Perché così confuso?

Questo numero è abbastanza distaccato da qualsiasi metrica fisica o significativa. Molti programmatori junior non hanno avuto esperienza con file hole o collegamenti hard / sym . Inoltre, la documentazione disponibile su questo argomento specifico è praticamente inesistente.

La disgiunzione e l'ambiguità del termine "dimensione del blocco" è stata il risultato della confusione di numerose misure diverse e dei livelli relativamente profondi di astrazione che ruotano attorno all'accesso al disco.

Esempi di informazioni contrastanti: du(o ls -s) vsstat

L'esecuzione du *in una cartella di progetto produce quanto segue: (Nota: ls -srestituisce gli stessi risultati).

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

Totale : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 blocchi

Eppure quando uno corre statvediamo un diverso insieme di valori. L'esecuzione statnella stessa directory produce:

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

Totale: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 blocchi

Nota: è possibile utilizzare il comando stat * --printf="%b\t(%B)\t%n: %s bytes\n"> per generare (in ordine) il numero di blocchi, (in parentesi) la dimensione di tali blocchi, il nome del file e la dimensione in byte, come mostrato sopra.

Ci sono due cose importanti da asporto:

  • statriporta sia physical_blocks_in_usee physical_block_sizecome utilizzati nella formula sopra. Si noti che questi sono valori basati su interfacce del sistema operativo.
  • dusta fornendo ciò che è generalmente accettato come una stima abbastanza accurata dell'utilizzo del disco fisico.

Per riferimento, ecco la ls -ldirectory di sopra:

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

26

Questo è il numero totale di blocchi del file system, inclusi i blocchi indiretti, utilizzati dai file elencati. Se corri ls -ssugli stessi file e sommi i numeri riportati otterrai lo stesso numero.


Questo semplicemente non è vero. Esempio: /bin/ls -s-> total 15 2 filename 3 filename2 3 filename3 3 filename4 2 filename5 2 filename6 2 filename8 2 filename9
Don Scott,

3
Non so su quale sistema ti trovi, ma per me è vero. Esempio: gist.github.com/rfjakob/200f6001bf91cf801891
Jakob

@Jakob Ha pubblicato una risposta completa, dai un'occhiata e fammi sapere se questo chiarisce.
Don Scott,

Questo non è vero in Git Bash per Windows.
entro il

18

Solo per citare - puoi usare -h (ls -lh) per convertirlo in un formato leggibile dall'uomo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.