Por que é rm -rf e não rmdir -rf

11

Sempre fiquei curioso porque o comando para excluir tudo em um diretório é rm -rf .

Por que não há sinalizadores para fazer a mesma coisa com rmdir ?

Não seria mais intuitivo usar rmdir para operações de diretório?

    
por kouroshk 12.12.2015 / 22:33

3 respostas

22

No início do sistema de arquivos Unix (pelo menos nos dias V7, por volta de 1970) os diretórios foram implementados como arquivos especiais e somente o root poderia usar a chamada de sistema mknod(2) que os criou e somente root poderia unlink(2) arquivo.

Essas proteções estavam no lugar para manter a estrutura do sistema de arquivos consistente. Por exemplo, se um usuário tiver permissão para gravar em um arquivo especial de diretório, ele poderá tornar seu diretório pai .. point para ele 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 podem ser feitas, isto é apenas um exemplo claro.

A consistência foi mantida pelos programas de espaço do usuário, como mkdir(1) e rmdir(1) , que eram a raiz do Set-UID para que pudessem fazer as chamadas de sistema privilegiadas em nome de um usuário não privilegiado. Quando a recursão foi incluída em rm(1) , o comando remove será executado como o UID atual e, em seguida, chamará rmdir(1) exclusivamente 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 o necessário.

Algum tempo depois, mkdir(2) e rmdir(2) foram adicionados como suas próprias chamadas de sistema, mas a relação entre rm(1) e rmdir(1) permanece.

Pessoalmente, acho um pouco mais satisfatório para rmdir junk e sei que o pior que fiz foi remover um diretório vazio.

    
por 13.12.2015 / 00:07
7

É histórico. rm foi feito para remover as referências aos arquivos, rmdir foi feito para remover diretórios, paralelo a mkdir . Há muitos anos, o Unix rm só podia remover diretórios invocando rmdir . Também não houve uma chamada de sistema rmdir(2) , rmdir foi um programa que chamou unlink(2) .

Referências:

por 13.12.2015 / 00:07
3

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, então faz sentido que rm os remova, mas os trate especialmente (isto é, requerer 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.

    
por 12.12.2015 / 23:31