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.
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).
É 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.
rmdir
remove diretórios,rm
remove. Por que seria intuitivormdir
remover os não diretórios?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 serunlink(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)
ermdir(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 adicionadarm(1)
, o comando remove seria executado como o UID atual e, em seguida, era chamadormdir(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)
ermdir(2)
foram adicionados como seu próprio sistema chama, mas a relação entrerm(1)
ermdir(1)
permanece.Pessoalmente, acho um pouco mais gratificante
rmdir junk
e sei que o pior que fiz foi remover um diretório vazio.fonte
rmdir
, ela ainda precisaria de um-r
sinalizador. (rmdir -r junk
Em vez derm -r junk
, ermdir 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 amkdir
. Muitos anos atrás, o Unixrm
só podia remover diretórios invocandormdir
. Também não houve umarmdir(2)
chamada do sistema,rmdir
houve um programa que chamouunlink(2)
.Referências:
fonte
É apenas uma questão de opinião, mas
rm
remove arquivos enquantormdir
remove diretórios. Um diretório é um arquivo, mas um tipo especial de arquivo; portanto, faz sentidorm
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 pararmdir
remover algo que não é um diretório.fonte
rm
remover um diretório vazio (exceto no modo recursivo)?-r
sinalizador ative o recurso de arquivo especial do diretório.