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

13

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 rmdirpara operações de diretório?

kouroshk
fonte
9
rmdirremove diretórios, rmremove. Por que seria intuitivo rmdirremover os não diretórios?
Stéphane Chazelas
5
Porque não é. Você está com 40 e poucos anos de atraso fazendo esta pergunta e está perguntando às pessoas erradas.
user207421

Respostas:

25

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 junke sei que o pior que fiz foi remover um diretório vazio.

msw
fonte
1
Quanto à última frase: presumivelmente, se a operação de exclusão recursiva estivesse ativa rmdir, ela ainda precisaria de um -rsinalizador. ( rmdir -r junkEm vez de rm -r junk, e rmdir junkainda só funciona se o diretório está vazio)
user253751
7

É histórico. rmfoi feito para remover as referências a arquivos, rmdirfoi feito para remover diretórios, paralelamente a mkdir. Muitos anos atrás, o Unix rmsó podia remover diretórios invocando rmdir. Também não houve uma rmdir(2)chamada do sistema, rmdirhouve um programa que chamou unlink(2).

Referências:

Dee Hendrick
fonte
2

É apenas uma questão de opinião, mas rmremove arquivos enquanto rmdirremove diretórios. Um diretório é um arquivo, mas um tipo especial de arquivo; portanto, faz sentido rmremovê-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 rmdirremover algo que não é um diretório.

Darwin von Corax
fonte
1
Se for esse o caso, por que não pode rmremover um diretório vazio (exceto no modo recursivo)?
user253751
Pelo mesmo motivo, não é possível remover um diretório completo - exige que o -rsinalizador ative o recurso de arquivo especial do diretório.
Darwin von Corax
1
Raciocínio circular lá ...
user253751
Eu diria que meu raciocínio tem uma excentricidade >> 1 ...
Darwin von Corax