Este é um post pequeno e engraçado sobre diretórios em sistemas *nix que é completamente inútil e desnecessário na prática. Afinal, é sexta-feira.
Em entrevistas, frequentemente surgem perguntas tediosas sobre inodes, que tudo é arquivo, e poucos conseguem responder de forma razoável. Mas, se cavarmos um pouco mais fundo, podemos encontrar coisas curiosas.
Para entender o post, aqui estão alguns pontos:
- tudo é arquivo. um diretório também é um arquivo
- metadados de um arquivo são armazenados no inode, mas o nome do arquivo não é armazenado ali
- o nome do arquivo é armazenado nos dados do diretório
- o tamanho do diretório, aquele que aparece no ls e que por padrão é de 4KB, depende do número de arquivos no diretório e do comprimento de seus nomes
- é evidente que quanto mais arquivos, maior é o tamanho do diretório
E agora algo interessante: criamos um diretório com um milhão de arquivos, verificamos o tamanho do diretório e depois apagamos todos os arquivos e olhamos o tamanho do diretório.
$ mkdir niceDir && cd niceDir
# dependendo da velocidade do meio, o próximo comando pode levar de 2 a 10 minutos
$ for ((i=1;i<133700;i++)); do touch long_long_looong_man_sakeru_$i ; done
$ ls -lhd .
drwxr-xr-x 2 user user 8.1M Aug 2 13:37 .
$ find . -type f -delete
$ ls -l
total 0
$ ls -lhd .
drwxr-xr-x 2 user user 8.1M Aug 2 13:37 .Como se pode notar, o tamanho do diretório não mudou, embora parecesse que sim 🙂
Para corrigir o tamanho do diretório (sem remoção) só é possível usando fsck (com a opção -D) em estado desmontado.
E quando fui procurar por que isso acontece, descobri que há 10 anos esse comportamento já foi relatado no lkml. E, segundo os desenvolvedores, a correção simplesmente não vale o esforço.
Fonte: habr.com
