O sistema de arquivos provavelmente mantém uma contagem de blocos de dados usados e livres como parte da operação normal. df
usa essas informações.
Mesmo que o sistema de arquivos não mantenha um contador em tempo real, ele precisa de uma maneira rápida de encontrar blocos livres ao gravar novos dados, e esses mesmos dados também podem ser usados para encontrar o número de blocos livres.
Em teoria, algum sistema de arquivos pode manter um contador de espaço tão usado em uma base por diretório também. No entanto, existem alguns problemas.
Se a contagem foi mantida para toda a subárvore recursivamente, o sistema de arquivos precisaria propagar os números de uso para uma profundidade arbitrária. Isso pode desacelerar todas as operações de gravação. Se fosse mantido apenas para os arquivos imediatamente dentro do diretório, um passeio recursivo da árvore ainda seria necessário para encontrar o tamanho total de uma árvore.
Em sistemas de arquivos do tipo Unix, os hard links são um obstáculo ainda maior. Quando um arquivo pode ser vinculado a vários diretórios (ou várias vezes a partir do mesmo diretório), ele não possui um diretório pai exclusivo. Onde o tamanho do arquivo seria contado? Contá-lo em todos os diretórios vinculados a ele produziria um uso total inflado, pois o arquivo poderia ser contado várias vezes. Contar em apenas um diretório também seria obviamente errado.
Na verdade, arquivos (ou seja, inodes) em sistemas de arquivos Unix tradicionais nem sequer conhecem os diretórios em que residem, apenas a contagem de links para eles (os nomes que possuem). Na maior parte das vezes, essas informações não são necessárias, pois os arquivos são acessados principalmente pelo nome. O armazenamento também exigiria uma quantidade arbitrária de dados no inode, duplicando os dados nos diretórios.