Risposte:
Il motivo principale è probabilmente storico. Ritorno ai vecchi, vecchi tempi, non ci sono stati rmdir(2)e mkdir(2)chiamate di sistema (stiamo discutendo 7th Edition UNIX ™ qui), e rmdir(1)fu (per necessità) un programma SUID root che ha utilizzato il unlink(2)chiamata di sistema per rimuovere le directory.
I manuali UNIX della 7a edizione sono disponibili online all'indirizzo http://cm.bell-labs.com/7thEdMan (ultimo controllo 23-04-2017); Sono disponibili anche su http://plan9.bell-labs.com/7thEdMan (ultimo controllo 23-04-2017). Sembra anche che ci sia almeno una fonte alternativa online - http://wolfram.schneider.org/bsd/7thEdManVol2/ - per gli articoli nel Volume 2, con un collegamento al sito FreeBSD per i comandi e le chiamate di sistema nel Volume 1 .
Il rmcomando (un normale programma non SUID) ha invocato il rmdir(1)comando per rimuovere le directory vuote. Non poteva farlo da solo; che richiedeva privilegi di root. Quindi, il rmdir(1)comando (vedi qui per il suo codice sorgente in Unix V7) esisteva per rimuovere le directory vuote e il rmcomando non rimuoveva le directory vuote.
Per utilizzare rmper rimuovere le directory, devi dare l' -ropzione.
C'è anche un argomento di simmetria. È necessario un comando mkdir(1)per creare directory; sembra ragionevole avere un comando rmdir(1)per annullare ciò che ha mkdir(1)fatto. Inoltre sono (in questi giorni) semplici esercitatori delle chiamate the rmdir(2)e di mkdir(2)sistema - sì, già nella 7a Edizione UNIX, mkdir(1)era anche un programma root SUID, usando la mknod(2)chiamata per creare un nodo di directory e la link(2)chiamata per creare le voci .e ..nella directory .
fsck(1)è quello che è sopravvissuto.
"rm" non funziona su directory. Devi usare rmdir o specificare l'opzione -r per una cancellazione ricorsiva. La ragione è storica: unlinke rmdirsono chiamate di sistema separati e sono stati fin dai primi giorni di Unix.
rmdir(2)né mkdir(2)esisteva né come chiamata di sistema; l'utente rootpuò usare la mknod(2)chiamata per creare un nodo di directory e la link(2)chiamata per creare le voci .e ..nella directory; e rootpotrebbe usare la unlink(2)chiamata per rimuovere le voci della rubrica.
Inoltre rmdir rimuove solo le directory vuote . Se vuoi assicurarti di non eliminare alcun file aggiuntivo in una directory, rmdirè più sicuro di rm -r(tranne se hai alm rm tale che devi sempre confermare ciò che elimini, cioè alias rm='rm -i'in ~ / .bashrc o qualunque cosa tu stia usando ).
Inoltre, rmdirsemplifica la rimozione di directory vuote con espressioni globbing (jolly). Ad esempio, per rimuovere tutte le directory vuote /tmpsenza toccare alcun file o directory con contenuti:
cd /tmp ; rmdir *
rmdir /tmp/*. Se la /tmpdirectory è davvero grande, questo potrebbe esaurire lo spazio per gli argomenti un po 'più veloce a causa dei cinque caratteri extra per nome, ma non richiede cddi spostarti nella gerarchia di directory. Vale anche la pena considerare rmdir /tmp/* 2>/dev/nulldi evitare di vedere i messaggi di errore (in genere ce ne saranno molti e quasi tutti saranno irrilevanti per tale compito a portata di mano).