¿Cuál es ese "total" en la primera línea después de ls -l? [cerrado]

131

¿Cuál es el totalen la salida 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
fuente

Respuestas:

94

Puede encontrar la definición de esa línea en la lsdocumentación de su plataforma. Para coreutils ls(el que se encuentra en muchos sistemas Linux), la información se puede encontrar a través de info coreutils ls:

Para cada directorio que aparece en la lista, prefacio los archivos con una línea 'total BLOCKS', donde BLOCKS es la asignación total de disco para todos los archivos en ese directorio.

Estera
fuente
14
Curiosamente, man lsen mi sistema no menciona esa línea, pero info coreutils lssí. ¿Cómo viene man lsy info coreutils lstiene información diferente sobre el mismo comando? ¿Por qué no lssolo se documenta una vez? Tener dos documentaciones diferentes para el mismo comando parece estar preparado para el fracaso.
HelloGoodbye
1
infoLos documentos para las cosas de Coreutils son a menudo más detallados que las páginas de manual. Es por eso que tienen una nota al final de cada página de manual que lo remite a la sección de información para obtener más detalles.
Mat
77
Ah Y lo ejecuté info lspara dar el mismo resultado que info coreutils ls. ¿Qué hace el argumento coreutils?
Hola
46

La Fórmula: ¿Cuál es ese número?

total int = Suma de (physical_blocks_in_use) * physical_block_size / ls_block_size) para cada archivo.

Dónde:

  • ls_block_sizees una variable de entorno arbitraria (normalmente 512 o 1024 bytes) que se puede modificar libremente con el --block-size=<int>indicador activado ls, la POSIXLY_CORRECT=1variable de entorno GNU (para obtener unidades de 512 bytes) o el -kindicador para forzar unidades de 1kB.
  • physical_block_sizees el valor dependiente del sistema operativo de una interfaz de bloque interno, que puede o no estar conectado al hardware subyacente. Este valor normalmente es 512b o 1k, pero depende completamente del sistema operativo. Se puede revelar a través del %Bvalor en stato fstat. Tenga en cuenta que este valor (casi siempre) no está relacionado con la cantidad de bloques físicos en un dispositivo de almacenamiento moderno .

¿Por qué tan confuso?

Este número está bastante separado de cualquier métrica física o significativa. Muchos programadores junior no han tenido experiencia con agujeros de archivo o enlaces hard / sym . Además, la documentación disponible sobre este tema específico es prácticamente inexistente.

La desarticulación y la ambigüedad del término "tamaño de bloque" ha sido resultado de numerosas medidas diferentes que se confunden fácilmente, y los niveles relativamente profundos de abstracción giran en torno al acceso al disco.

Ejemplos de información conflictiva: du(o ls -s) vsstat

La ejecución du *en una carpeta de proyecto produce lo siguiente: (Nota: ls -sdevuelve los mismos resultados).

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 bloques

Sin embargo, cuando uno corre stat, vemos un conjunto diferente de valores. Ejecutar staten el mismo directorio 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

Total: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 bloques

Nota: Puede usar el comando stat * --printf="%b\t(%B)\t%n: %s bytes\n"> para generar (en orden) el número de bloques, (en pares) el tamaño de esos bloques, el nombre del archivo y el tamaño en bytes, como se muestra arriba.

Hay dos cosas importantes para llevar:

  • statinforma tanto el physical_blocks_in_usey physical_block_sizecomo se utiliza en la fórmula anterior. Tenga en cuenta que estos son valores basados ​​en las interfaces del sistema operativo.
  • duproporciona lo que generalmente se acepta como una estimación bastante precisa de la utilización del disco físico.

Como referencia, aquí está el ls -ldirectorio de arriba:

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
fuente
26

Esa es la cantidad total de bloques del sistema de archivos, incluidos los bloques indirectos, utilizados por los archivos enumerados. Si ejecuta ls -slos mismos archivos y suma los números informados, obtendrá ese mismo número.

Dave Lasley
fuente
Esto simplemente no es cierto. Ejemplo: /bin/ls -s-> total 15 2 filename 3 filename2 3 filename3 3 filename4 2 filename5 2 filename6 2 filename8 2 filename9
Don Scott, el
3
No sé en qué sistema estás, pero para mí, es cierto. Ejemplo: gist.github.com/rfjakob/200f6001bf91cf801891
Jakob
@Jakob publicó una respuesta completa, eche un vistazo y avíseme si eso lo aclara.
Don Scott
Esto no es cierto en Git bash para Windows.
Thdoan
18

Solo para mencionar: puede usar -h (ls -lh) para convertir esto en formato legible para humanos.

Tsvetomir Dimitrov
fuente