Respostas:
A principal razão é provavelmente histórica. De volta aos velhos, velhos tempos, não há foram rmdir(2)e mkdir(2)chamadas de sistema (estamos discutindo 7ª Edição UNIX ™ aqui), e rmdir(1)foi (por necessidade) um programa SUID root que usou a unlink(2)chamada de sistema para remover diretórios.
Os manuais da 7ª edição do UNIX estão disponíveis online em http://cm.bell-labs.com/7thEdMan (última verificação em 23-04-2017); Eles também estão disponíveis em http://plan9.bell-labs.com/7thEdMan (última verificação em 23/04/2017). Também parece haver pelo menos uma fonte alternativa online - http://wolfram.schneider.org/bsd/7thEdManVol2/ - para os artigos do Volume 2, com um link para o site do FreeBSD para os comandos e chamadas do sistema no Volume 1. .
O rmcomando (um programa regular não SUID) chamou o rmdir(1)comando para remover diretórios vazios. Não poderia fazer isso sozinho; que exigiam privilégios de root. Portanto, o rmdir(1)comando (veja aqui o código fonte no Unix V7) existia para remover diretórios vazios e o rmcomando não removeu os diretórios vazios.
Para usar rmpara remover diretórios, você deve dar a -ropção
Há também um argumento de simetria. Você precisa de um comando mkdir(1)para criar diretórios; parece razoável ter um comando rmdir(1)para desfazer o que mkdir(1)fez. Além disso, são (atualmente) simples exercitadores das chamadas the rmdir(2)e mkdir(2)system - sim, na 7ª Edição UNIX, mkdir(1)também era um programa raiz SUID, usando a mknod(2)chamada para criar um nó de diretório e a link(2)chamada para criar as entradas .e ..no diretório .
fsck(1)é o único que sobreviveu.
"rm" não funciona em diretórios. Você precisa usar rmdir ou especificar a opção -r para uma exclusão recursiva. A razão é histórica: unlinke rmdirsão chamadas de sistema separadas e tem sido desde os primeiros dias de Unix.
rmdir(2)nem mkdir(2)existia nem como uma chamada de sistema; o usuário rootpode usar a mknod(2)chamada para criar um nó de diretório e a link(2)chamada para criar as entradas .e ..no diretório; e rootpoderia usar a unlink(2)chamada para remover as entradas do diretório.
O rmdir também remove apenas diretórios vazios . Se você deseja ter certeza de que não exclui nenhum arquivo adicional em um diretório, rmdiré mais seguro do que rm -r(exceto se você aliasar rm de forma que sempre precise confirmar o que excluir, por exemplo, alias rm='rm -i'em ~ / .bashrc ou o que estiver usando )
Além disso, rmdirfacilita a remoção de diretórios vazios com expressões ocultas (curinga). Por exemplo, para remover todos os diretórios vazios /tmpsem tocar em nenhum arquivo ou diretório com conteúdo:
cd /tmp ; rmdir *
rmdir /tmp/*. Se o /tmpdiretório for realmente grande, isso pode ficar sem espaço para argumentos um pouco mais rápido devido aos cinco caracteres extras por nome, mas não requer que cdvocê se mova pela hierarquia de diretórios. Também vale rmdir /tmp/* 2>/dev/nulla pena considerar evitar ver mensagens de erro (normalmente haverá muitas e quase todas serão irrelevantes para essa tarefa em mãos).