Qual é a razão para rmdir(1) e rm(1) coexistirem?

Qual é a razão para rmdir(1) e rm(1) coexistirem?

Eu uso BSD e Linux todos os dias, nunca tive uma circunstância em que devesse usar rmdir(1) em vez de rm(1). Qual é o propósito da existência do rmdir?

Responder1

A principal razão é provavelmente histórica. Antigamente, não existiam chamadas rmdir(2)de mkdir(2)sistema (estamos discutindo a 7ª Edição UNIX™ aqui) e rmdir(1)era (necessariamente) um programa raiz SUID que usava a unlink(2)chamada de sistema para remover diretórios.

Os manuais do UNIX da 7ª Edição estão disponíveis on-line emhttp://cm.bell-labs.com/7thEdMan(última verificação em 23/04/2017); Eles também estão disponíveis emhttp://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 link para oFreeBSDsite para os comandos e chamadas de sistema no Volume 1.

O rmcomando (um programa normal não SUID) invocou o rmdir(1)comando para remover diretórios vazios. Não poderia fazê-lo sozinho; que exigia privilégios de root. Então, o rmdir(1)comando (vejaaquipara seu código-fonte no Unix V7) existia para remover diretórios vazios, e o rmcomando não removeu diretórios vazios por si só.

Para usar rmpara remover diretórios, você tem que 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)aconteceu. Além disso, eles são (hoje em dia) simples exercitadores das chamadas de sistema rmdir(2)e mkdir(2)- sim, na 7ª edição do 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 .

Responder2

"rm" não funciona em diretórios. Você deve 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 existem desde os primeiros dias do Unix.

Responder3

Além disso, rmdir remove apenasvaziodiretórios. Se você quiser ter certeza de não excluir nenhum arquivo adicional em um diretório, rmdiré mais seguro do que rm -r(exceto se você tiver um alias rm de modo que você sempre precise confirmar o que excluiu, ou seja, alias rm='rm -i'em ~/.bashrc ou o que quer que esteja usando ).

Responder4

Além disso, rmdirfacilita a remoção de diretórios vazios com expressões globbing (curinga). Por exemplo, para remover todos os diretórios vazios /tmpsem tocar em nenhum arquivo ou diretório com conteúdo:

cd /tmp ; rmdir *

informação relacionada