Por que “ls -l” reporta o tamanho físico de um diretório enquanto relata o tamanho lógico de um arquivo?

4

Eu observei que ls -l informa o tamanho físico de um diretório enquanto relata 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

dir1 size é 36864 bytes, que é um múltiplo de 4096 bytes (provavelmente é o tamanho físico).

Enquanto file1.txt size é 6 bytes (que é o tamanho lógico).

    
por user7681202 24.04.2017 / 00:44

2 respostas

2

Na verdade, ls informa tudo o que o kernel diz: não faz nada diferente em relação ao tamanho, dependendo de o arquivo ser um diretório). E o Linux reporta 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 o que você está usando. O Ext4 aloca blocos inteiros para diretórios e gerencia o espaço dentro desses blocos como achar melhor. Ele nem mesmo libera blocos se um diretório encolher ( dir1 continuaria tendo 9 blocos, mesmo se você removesse todos os arquivos contidos nele). Quando perguntado sobre o tamanho de um arquivo que por acaso é um diretório, o ext4 retorna o tamanho alocado para o diretório, e este é sempre um número inteiro de blocos.

Diferentes tipos de sistema 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.

    
por 24.04.2017 / 00:55
2

Esse é um recurso dos sistemas de arquivos ext2 / ext3 / ext4 , eles relatam o tamanho dos diretórios em blocos completos. Se você tentar o mesmo com o XFS, verá um tamanho mais refinado.

Não importa, na verdade. Para arquivos, o tamanho "lógico" é relevante, pois um aplicativo pode depender do tamanho do 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. 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 do usuário não pode ler o conteúdo de um diretório diretamente. Em vez disso, uma leitura tem que passar por chamadas de sistema feitas apenas para esse fim. E essas chamadas do sistema lidam com a estrutura interna do diretório.

    
por 24.04.2017 / 00:58