É tecnicamente possível excluir .
, pelo menos em sistemas de arquivos EXT4. Se você criar uma imagem do sistema de arquivos em test.img
, montá-la e criar uma pasta test
, desmonte-a novamente, edite-a usando debugfs
:
debugfs -w test.img
cd test
unlink .
debugfs
não recusa e elimina obedientemente a entrada de diretório .
no sistema de arquivos. O diretório test
ainda é utilizável, com uma surpresa:
sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls
mostra apenas
..
então .
realmente desapareceu. Ainda cd .
, ls .
, pwd
ainda se comporta como de costume!
Eu já fiz esse teste usando rmdir .
, mas isso exclui o inode do diretório ( enorme graças a BowlOfRed para apontando isto ), o que deixa test
uma entrada de diretório pendente e é a verdadeira razão para os problemas encontrados. Nesse cenário, a pasta test
se torna inutilizável; depois de montar a imagem, executando ls
produz
ls: cannot access '/mnt/test': Structure needs cleaning
e o log do kernel mostra
EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913
A execução de e2fsck
nessa situação na imagem exclui completamente o diretório test
(o inode do diretório desapareceu, por isso não há nada para restaurar).
Tudo isso mostra que .
existe como uma entidade específica no sistema de arquivos EXT4. Eu tenho a impressão de que o código do sistema de arquivos no kernel espera que .
e ..
existam, e avisa se eles não o fizerem (veja namei.c
), mas com o teste unlink .
-based eu não vi esse aviso. e2fsck
não gosta da entrada de diretório .
ausente e oferece a correção:
$ /sbin/e2fsck -f test.img
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Missing '.' in directory inode 30721.
Fix<y>?
Isso recria a entrada de diretório .
.