La razón principal es probablemente histórica. En los viejos tiempos, no había rmdir(2)
y mkdir(2)
llamadas al sistema (estamos hablando de la 7.ª edición de UNIX™ aquí), y rmdir(1)
era (por necesidad) un programa raíz SUID que usaba el unlink(2)
llamada al sistema para eliminar directorios.
Los manuales de UNIX de la séptima edición están disponibles en línea en http://cm.bell-labs.com/7thEdMan (última consulta el 23 de abril de 2017); También están disponibles en http://plan9.bell-labs.com/7thEdMan (última consulta el 23 de abril de 2017). También parece haber al menos una fuente alternativa en línea, http://wolfram.schneider.org/bsd/7thEdManVol2/, para los artículos en el Volumen 2, con un enlace al sitio de FreeBSD para los comandos y llamadas al sistema en el Volumen 1. .
El rm
comando (un programa regular que no es SUID) invocó el rmdir(1)
Comando para eliminar directorios vacíos. No podría hacerlo por sí mismo; que requería privilegios de root. Entonces, el rmdir(1)
(ver aquí para su código fuente en Unix V7) existía para eliminar directorios vacíos, y el rm
El comando no eliminó los directorios vacíos por sí mismo.
Para usar rm
para eliminar directorios, tienes que dar el -r
opción.
También hay un argumento de simetría. Necesitas un comando mkdir(1)
para crear directorios; parece razonable tener un comando rmdir(1)
para deshacer lo mkdir(1)
hizo. Además, son (en estos días) simples ejercitadores del rmdir(2)
y mkdir(2)
llamadas al sistema:sí, en la 7.ª edición de UNIX, mkdir(1)
también era un programa raíz SUID, usando el mknod(2)
llamada para crear un nodo de directorio y el link(2)
llamar para crear el .
y ..
entradas en el directorio.
"rm" no funciona en directorios. Debe usar rmdir o especificar el interruptor -r para una eliminación recursiva. La razón es histórica:unlink
y rmdir
son llamadas al sistema separadas y lo han sido desde los primeros días de Unix.
Además, rmdir solo elimina vacío directorios. Si quiere asegurarse de no eliminar ningún archivo adicional en un directorio, rmdir
es más seguro que rm -r
(excepto si usó un alias de rm de tal manera que siempre necesita confirmar lo que elimina, es decir, alias rm='rm -i'
en ~/.bashrc o lo que estés usando).