O que é esse "total" na primeira linha depois de ls -l? [fechadas]

131

Qual é totalo resultado 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
fonte

Respostas:

94

Você pode encontrar a definição dessa linha na lsdocumentação da sua plataforma. Para coreutils ls(o encontrado em muitos sistemas Linux), as informações podem ser encontradas em info coreutils ls:

Para cada diretório listado, anteceda os arquivos com a linha 'total BLOCKS', em que BLOCKS é a alocação total de disco para todos os arquivos nesse diretório.

Esteira
fonte
14
Curiosamente, man lsno meu sistema não menciona essa linha, mas info coreutils lsfaz. Como vem man lse info coreutils lstem informações diferentes sobre o mesmo comando? Por que não é lsdocumentado apenas uma vez? Ter duas documentações diferentes para o mesmo comando parece estar configurado para falha.
HelloGoodbye
1
infodocumentos para o material coreutils geralmente são mais detalhados do que as páginas de manual. É por isso que eles têm uma nota no final de cada página de manual, referindo-se à seção de informações para obter mais detalhes.
Mat
7
Ah Eu executei info lse para dar a mesma saída que info coreutils ls. O que o argumento coreutilsfaz?
hellogoodbye
46

A fórmula: qual é esse número?

total int = Soma de (Physical_blocks_in_use) * Physical_block_size / ls_block_size) para cada arquivo.

Onde:

  • ls_block_sizeé uma variável de ambiente arbitrária (normalmente 512 ou 1024 bytes) que pode ser modificada livremente com o --block-size=<int>sinalizador ativado ls, a POSIXLY_CORRECT=1variável de ambiente GNU (para obter unidades de 512 bytes) ou o -ksinalizador para forçar unidades de 1kB.
  • physical_block_sizeé o valor dependente do SO de uma interface de bloco interno, que pode ou não estar conectada ao hardware subjacente. Esse valor normalmente é 512b ou 1k, mas depende completamente do sistema operacional. Pode ser revelado através do %Bvalor em statou fstat. Observe que esse valor (quase sempre) não está relacionado ao número de blocos físicos em um dispositivo de armazenamento moderno .

Por que tão confuso?

Esse número é bastante desanexado de qualquer métrica física ou significativa. Muitos programadores juniores não tiveram experiência com falhas de arquivos ou links físicos / sym . Além disso, a documentação disponível neste tópico específico é praticamente inexistente.

A falta de articulação e a ambiguidade do termo "tamanho do bloco" resulta de inúmeras medidas diferentes serem facilmente confundidas e os níveis relativamente abstratos de abstração girando em torno do acesso ao disco.

Exemplos de informações conflitantes: du(ou ls -s) vsstat

A execução du *em uma pasta do projeto produz o seguinte: (Nota: ls -sretorna os mesmos 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 blocos

No entanto, quando se corre stat, vemos um conjunto diferente de valores. A execução statno mesmo diretório produz:

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 blocos

Nota: Você pode usar o comando stat * --printf="%b\t(%B)\t%n: %s bytes\n"> para gerar (em ordem) o número de blocos (em parênteses) o tamanho desses blocos, o nome do arquivo e o tamanho em bytes, como mostrado acima.

Há duas coisas importantes a serem levadas em consideração:

  • statrelata o physical_blocks_in_usee physical_block_sizecomo usado na fórmula acima. Observe que esses são valores baseados nas interfaces do SO.
  • duestá fornecendo o que geralmente é aceito como uma estimativa bastante precisa da utilização do disco físico.

Para referência, aqui está o ls -ldiretório acima:

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

Esse é o número total de blocos do sistema de arquivos, incluindo blocos indiretos, usados ​​pelos arquivos listados. Se você executar ls -sos mesmos arquivos e somar os números relatados, obterá o mesmo número.

Dave Lasley
fonte
Isso simplesmente não é verdade. Exemplo: /bin/ls -s-> total 15 2 filename 3 filename2 3 filename3 3 filename4 2 filename5 2 filename6 2 filename8 2 filename9
Don Scott
3
Não sei em que sistema você está, mas para mim é verdade. Exemplo: gist.github.com/rfjakob/200f6001bf91cf801891
Jakob
@Jakob Publicou uma resposta completa, dê uma olhada e deixe-me saber se isso esclarece.
Don Scott
Isso não é verdade no Git bash para Windows.
Thdan # 30/17
18

Apenas para mencionar - você pode usar -h (ls -lh) para converter isso em formato legível por humanos.

Tsvetomir Dimitrov
fonte