Eu sempre fiquei curioso por que o comando para excluir tudo em um diretório é rm -rf
.
Por que não há sinalizadores para fazer a mesma coisa rmdir
?
Não seria mais intuitivo usar rmdir
para operações de diretório?
Eu sempre fiquei curioso por que o comando para excluir tudo em um diretório é rm -rf
.
Por que não há sinalizadores para fazer a mesma coisa rmdir
?
Não seria mais intuitivo usar rmdir
para operações de diretório?
Respostas:
No início do Unix File System (pelo menos nos dias V7, por volta de 1970), os diretórios eram implementados como arquivos especiais e somente o root podia usar a mknod(2)
chamada do sistema que os criava e somente o root podia ser unlink(2)
um arquivo especial do diretório.
Essas proteções estavam em vigor para manter a estrutura do sistema de arquivos consistente. Por exemplo, se um usuário tivesse permissão para gravar em um arquivo especial de diretório, ele poderia fazer seu diretório pai ..
apontar para si mesmo (especificamente seu próprio nó i). Isso criaria uma referência circular no sistema de arquivos que seria uma coisa ruim. Claro que existem outras inconsistências que se poderia fazer, este é apenas um exemplo claro.
A consistência foi mantida por programas de espaço do usuário como mkdir(1)
e rmdir(1)
que eram raiz do Set-UID para que eles pudessem fazer chamadas de sistema privilegiadas em nome de um usuário não privilegiado. Quando a recursão era adicionada rm(1)
, o comando remove seria executado como o UID atual e, em seguida, era chamado rmdir(1)
apenas para remover diretórios vazios. Este ainda é um método bastante padrão de elevação de permissão: não use mais permissões do que você precisa.
Algum tempo depois, mkdir(2)
e rmdir(2)
foram adicionados como seu próprio sistema chama, mas a relação entre rm(1)
e rmdir(1)
permanece.
Pessoalmente, acho um pouco mais gratificante rmdir junk
e sei que o pior que fiz foi remover um diretório vazio.
rmdir
, ela ainda precisaria de um -r
sinalizador. ( rmdir -r junk
Em vez de rm -r junk
, e rmdir junk
ainda só funciona se o diretório está vazio)
É histórico. rm
foi feito para remover as referências a arquivos, rmdir
foi feito para remover diretórios, paralelamente a mkdir
. Muitos anos atrás, o Unix rm
só podia remover diretórios invocando rmdir
. Também não houve uma rmdir(2)
chamada do sistema, rmdir
houve um programa que chamou unlink(2)
.
Referências:
É apenas uma questão de opinião, mas rm
remove arquivos enquanto rmdir
remove diretórios. Um diretório é um arquivo, mas um tipo especial de arquivo; portanto, faz sentido rm
removê-los, mas tratá-los especialmente (por exemplo, para exigir uma opção extra para ativar o recurso.) Por outro lado, nem todos os arquivos são diretórios, e não faz sentido IMHO para rmdir
remover algo que não é um diretório.
rm
remover um diretório vazio (exceto no modo recursivo)?
-r
sinalizador ative o recurso de arquivo especial do diretório.
rmdir
remove diretórios,rm
remove. Por que seria intuitivormdir
remover os não diretórios?