Il motivo principale è probabilmente storico. Ai vecchi, vecchi tempi, non c'erano rmdir(2)
e mkdir(2)
chiamate di sistema (qui stiamo discutendo di 7th Edition UNIX™) e rmdir(1)
era (per necessità) un programma root SUID che utilizzava il unlink(2)
chiamata di sistema per rimuovere le directory.
I manuali UNIX della settima edizione sono disponibili online all'indirizzo http://cm.bell-labs.com/7thEdMan (ultima verifica 2017-04-23); Sono disponibili anche su http://plan9.bell-labs.com/7thEdMan (ultima verifica 2017-04-23). Sembra esserci anche almeno una fonte alternativa online — http://wolfram.schneider.org/bsd/7thEdManVol2/ — per gli articoli nel Volume 2, con un collegamento al sito di FreeBSD per i comandi e le chiamate di sistema nel Volume 1 .
Il rm
comando (un normale programma non SUID) invocava il rmdir(1)
comando per rimuovere le directory vuote. Non poteva farlo da solo; che richiedeva i privilegi di root. Quindi, il rmdir(1)
Il comando (vedi qui per il suo codice sorgente in Unix V7) esisteva per rimuovere le directory vuote e il rm
il comando stesso non ha rimosso le directory vuote.
Per usare rm
per rimuovere le directory, devi dare -r
opzione.
C'è anche un argomento di simmetria. Hai bisogno di un comando mkdir(1)
creare directory; sembra ragionevole avere un comando rmdir(1)
per annullare ciò che mkdir(1)
fatto. In più sono (di questi tempi) semplici esercitatori del rmdir(2)
e mkdir(2)
chiamate di sistema — sì, nella settima edizione di UNIX, mkdir(1)
era anche un programma root SUID, usando il mknod(2)
chiamata per creare un nodo di directory e il link(2)
chiamata per creare il .
e ..
voci nella directory.
"rm" non funziona sulle directory. Devi usare rmdir o specificare l'opzione -r per una cancellazione ricorsiva. Il motivo è storico:unlink
e rmdir
sono chiamate di sistema separate e risalgono ai primi giorni di Unix.
Inoltre rmdir rimuove solo vuoto directory. Se vuoi assicurarti di non eliminare altri file in una directory, rmdir
è più sicuro di rm -r
(tranne se hai aliasato rm in modo tale da dover sempre confermare ciò che elimini, ad esempio alias rm='rm -i'
in ~/.bashrc o qualunque cosa tu stia usando).