Por que não consigo remover o '.' diretório?

38

Eu tentei remover o '.' diretório. Eu pensei que poderia simplesmente excluir meu diretório de trabalho sem ter que entrar em um diretório pai.

O objetivo da minha pergunta é procurar algumas dicas sobre como o sistema Linux funciona para excluir arquivos.

    
por Goldname 13.06.2016 / 08:06

2 respostas

89

A remoção do diretório atual não afeta a integridade do sistema de arquivos ou sua organização lógica. Evitar a remoção de . é feito para seguir o padrão POSIX, que declara no rmdir(2) página de manual:

If the path argument refers to a path whose final component is either dot or dot-dot, rmdir() shall fail.

Um motivo pode ser encontrado na rm página de manual:

The rm utility is forbidden to remove the names dot and dot-dot in order to avoid the consequences of inadvertently doing something like:

rm -r .*

Por outro lado, remover explicitamente o diretório atual (isto é, declarar seu caminho completo ou relativo) é uma operação permitida no Unix, pelo menos desde SVR3, como foi proibido com a versão 7 do Unix até SVR2. Isso é muito semelhante ao que acontece quando você remove um arquivo que está sendo lido ou gravado ativamente. Os processos que acessam o arquivo de exclusão continuam suas operações de leitura e gravação, como se nada tivesse acontecido. Depois de ter removido um diretório atual do processo, esse diretório não estará mais acessível, embora seu caminho, mas seu inode, permaneça presente no sistema de arquivos até que o processo morra ou mude seu próprio diretório.

Observe que o processo não poderá usar um caminho relativo a seu diretório atual para alterar seu cwd (por exemplo, cd .. ) porque não há mais uma entrada .. em seu diretório atual.

Quando alguém digita rmdir . , provavelmente espera que a entrada de diretório atual seja removida, mas quando um diretório é removido (usando seu caminho), três entradas de diretório são realmente removidas, . , .. e o diretório em si.

Remover apenas . e não a entrada de diretório desse diretório criaria um diretório não compatível, mas como já foi dito, é proibido pelo padrão.

Como @Emmanuel corretamente apontou, há uma segunda razão pela qual a remoção de . não é permitida. Há pelo menos um sistema operacional compatível com POSIX (Mac OS X com HFS +) que, com strongs restrições, suporta a criação de hardlinks para diretórios existentes. Nesse caso, não há um caminho claro de dentro do diretório para saber qual hardlink é o esperado para ser removido.

    
por 13.06.2016 / 09:32
7

Isso é feito para a integridade, já que você está dentro desse diretório e o . é apenas uma auto-referência.

Você precisa entrar em seu pai ou chamar rmdir com seu caminho, o que pode ser feito com:

rmdir 'pwd'

Se você precisar disso com frequência, poderá definir um alias como:

alias rmc='rmdir 'pwd''

.. que poderia ser chamado como rmc sozinho para remover o diretório atual.

    
por 13.06.2016 / 08:32