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

40

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

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

Nome de ouro
fonte
11
Tente rm -r 'pwd' para remover a dir atual sem realmente se movendo para dir pai
faadi
7
Esta pergunta não duplica essa. Essa pergunta por que o link físico existe como uma entidade física, em vez de ser sintetizado. Esta pergunta pergunta não apenas por que rm .e rmdir .não funciona, mas por que eles são especificados como não funcionando, o que é independente da existência física de um link físico.
JdeBP
9
Imagem que você subiu em uma árvore para cortar um galho. De que lado do corte você se senta quando começa a serrar? (Esse é o sistema de arquivos Linux em poucas palavras.)
michael
7
Imagine fazer rm -rf .*apenas para descobrir isso, incluindo não só .mas também .., e em seguida ../.., e depois ...
gerrit

Respostas:

89

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

Se o argumento do caminho se referir a um caminho cujo componente final seja ponto ou ponto, rmdir () falhará.

Uma justificativa pode ser encontrada na rmpágina de manual:

O utilitário rm é proibido de remover os nomes ponto e ponto a ponto, a fim de evitar as conseqüências de se fazer algo inadvertidamente:

rm -r. *

Por outro lado, remover explicitamente o diretório atual (declarando seu caminho completo ou relativo) é uma operação permitida no Unix, pelo menos desde o SVR3, pois foi proibido com o Unix versão 7 até o 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. Após a remoção de um diretório atual do processo, esse diretório não fica mais acessível por seu caminho, mas seu inode permanece presente no sistema de arquivos até o processo morrer ou alterar seu próprio diretório.

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

Quando alguém tipo rmdir ., eles provavelmente esperar a entrada do diretório atual a ser removido, mas quando um diretório é removido (usando seu caminho), três entradas de diretório são realmente removido, ., .., e o próprio diretório.

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

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

jlliagre
fonte
9
pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html "O significado da exclusão do nome do caminho / ponto não é claro, porque o nome do arquivo (diretório) no diretório pai a ser removido não é claro, principalmente na presença de vários links para um diretório "
Emmanuel
@Emmanuel A remoção de um diretório que possui mais de dois links (ou seja, não está vazio) já é proibida por design (diretório não vazio). Um diretório com uma contagem de links de um é proibido pelo padrão (pelo menos nos sistemas de arquivos em que a contagem de links tem um significado).
jlliagre
3
@ jlliagre: Não se trata de um diretório contendo vários links, mas de um diretório com vários links. Alguns sistemas de arquivos e / ou sistemas operacionais não permitem isso, mas não todos.
Jörg W Mittag
@ JörgWMittag Um diretório que contém vários diretórios possui vários links por design, porque todos os seus subdiretórios se ..vinculam a ele. Esse é o caso exclusivo da link count > 2esmagadora maioria dos sistemas operacionais e sistemas de arquivos, de modo que "alguns sistemas de arquivos e / ou sistemas operacionais" são um eufemismo. A única exceção conhecida não histórica é o Mac OS X com HFS +, que adiciona restrições sobre quem e o que pode ser feito. Concedido o comentário POSIX é direcionado para essa singularidade. Veja unix.stackexchange.com/questions/22394/…
jlliagre:
Ei, eu já fiz isso rm -r .*antes e isso estragou tudo sob o diretório pai de forma recursiva ... Isso foi há mais de uma década ou duas, mas é bom saber que rmnão permite mais isso.
antak
9

Isso é feito para integridade, pois você está atualmente dentro desse diretório e .é apenas uma auto-referência.

Você precisa ir no pai ou ligar rmdircom o 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 rmcsozinho para remover o diretório atual.

Julie Pelletier
fonte
13
Mas por que / como o rmdir .comando hipotético compromete a integridade do sistema de arquivos de uma maneira que afeta rmdir $(pwd)ou rmdir "$PWD"não?
G-Man Diz 'Reinstate Monica'
4
Não é uma questão de integridade do FS, mas de organização lógica. Ao escolher seu diretório atual, você diz ao shell para usá-lo para suas próximas operações, mas não pode remover algo de si mesmo.
Julie Pelletier
7
Receio que pareça conjetural.
Emmanuel
4
@FranklinPiat Não achei seu comentário particularmente útil: 1. Onde o OP usou rm *e o que você quer dizer com histórico do shell? 2. A resposta abordou a parte por que ; 3. Cuidados a elaborar?
JBentley
4
@ G-Man, se o fizer rmdir $(pwd), pwddescobre um nome lógico para o diretório atual, por exemplo /foo/bar/baz, e então rmdir, vendo esse caminho, remove a bazentrada do /foo/bardiretório, desde que as condições sejam atendidas. Isso faz sentido. O comando rmdir ., por outro lado, é uma instrução para remover a .entrada do diretório atual, o que não é permitido (violaria a restrição de que todo diretório tenha uma .entrada apontando para si mesmo) nem é útil (não removeria o link você queria remover).
hobbs