Por que "ls -l" informa o tamanho físico de um diretório enquanto informa o tamanho lógico de um arquivo?

Por que "ls -l" informa o tamanho físico de um diretório enquanto informa o tamanho lógico de um arquivo?

Percebi que ele ls -linforma o tamanho físico de um diretório enquanto informa o tamanho lógico de um arquivo. Por exemplo, este é um exemplo de saída de ls -l:

drwxr-xr-x 2 chris chris 36864 2017-04-23 18:14 dir1 
-rw-r--r-- 1 chris chris 6     2017-04-23 18:10 file1.txt

dir1o tamanho é 36.864 bytes, que é um múltiplo de 4.096 bytes (portanto, é provavelmente o tamanho físico).

Enquanto file1.txto tamanho é de 6 bytes (que é o tamanho lógico).

Responder1

Na verdade, lsreporta tudo o que o kernel diz: não faz nada diferente em relação ao tamanho dependendo se o arquivo é um diretório). E o Linux informa o tamanho lógico. Mas o tamanho lógico de um diretório não é uma propriedade muito interessante: depende do formato do sistema de arquivos.

O tipo de sistema de arquivos padrão na maioria das distribuições Linux é ext4, e provavelmente é isso que você está usando. Ext4 aloca blocos inteiros para diretórios e gerencia o espaço dentro desses blocos conforme achar necessário. Ele nem mesmo libera blocos se um diretório diminuir ( dir1continuaria tendo 9 blocos mesmo se você removesse todos os arquivos nele). Quando questionado sobre o tamanho de um arquivo que é um diretório, ext4 retorna o tamanho alocado para o diretório, e este é sempre um número inteiro de blocos.

Diferentes tipos de sistemas de arquivos se comportam de maneira diferente. Por exemplo, com o Btrfs, experimentalmente, o tamanho de um diretório pode ser qualquer múltiplo de 2.

Responder2

Essa é uma característica dos sistemas de arquivos ext2// , eles informam o tamanho dos diretórios em blocos completos. Se você tentar o mesmo com o XFS, verá um tamanho mais refinado.ext3ext4

Não importa, realmente. Para arquivos, o tamanho "lógico" é relevante, pois uma aplicação pode depender do conhecimento do tamanho de um arquivo até um byte: o lixo final pode ser relevante, ou alguma estrutura de dados pode ser colocada em uma posição relativa ao final do arquivo (por exemplo, arquivos .zip).

Para diretórios, o tamanho "lógico" não importa, já que a estrutura interna é bem conhecida e, no Linux, um programa de espaço de usuário não consegue nem ler diretamente o conteúdo de um diretório. Em vez disso, uma leitura precisa passar por chamadas de sistema feitas exatamente para esse propósito. E essas chamadas de sistema tratarão da estrutura interna do diretório.

informação relacionada