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.
filesystems
directory
rm
Nome de ouro
fonte
fonte
rm .
ermdir .
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.rm -rf .*
apenas para descobrir isso, incluindo não só.
mas também..
, e em seguida../..
, e depois ...Respostas:
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 narmdir(2)
página do manual:Uma justificativa pode ser encontrada na
rm
página de manual: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.fonte
..
vinculam a ele. Esse é o caso exclusivo dalink count > 2
esmagadora 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/…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 querm
não permite mais isso.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
rmdir
com o caminho, o que pode ser feito com:Se você precisar disso com frequência, poderá definir um alias como:
.. que poderia ser chamado
rmc
sozinho para remover o diretório atual.fonte
rmdir .
comando hipotético compromete a integridade do sistema de arquivos de uma maneira que afetarmdir $(pwd)
ourmdir "$PWD"
não?rm *
e o que você quer dizer com histórico do shell? 2. A resposta abordou a parte por que ; 3. Cuidados a elaborar?rmdir $(pwd)
,pwd
descobre um nome lógico para o diretório atual, por exemplo/foo/bar/baz
, e entãormdir
, vendo esse caminho, remove abaz
entrada do/foo/bar
diretório, desde que as condições sejam atendidas. Isso faz sentido. O comandormdir .
, 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).