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 rm
comando (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 rm
comando não removeu os diretórios vazios.
Para usar rm
para remover diretórios, você deve dar a -r
opçã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: unlink
e rmdir
sã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 root
pode 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 root
poderia 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, rmdir
facilita a remoção de diretórios vazios com expressões ocultas (curinga). Por exemplo, para remover todos os diretórios vazios /tmp
sem tocar em nenhum arquivo ou diretório com conteúdo:
cd /tmp ; rmdir *
rmdir /tmp/*
. Se o /tmp
diretó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 cd
você se mova pela hierarquia de diretórios. Também vale rmdir /tmp/* 2>/dev/null
a pena considerar evitar ver mensagens de erro (normalmente haverá muitas e quase todas serão irrelevantes para essa tarefa em mãos).