Respuestas:
La razón principal es probablemente histórica. En los viejos tiempos, no había rmdir(2)
y mkdir(2)
llamadas al sistema (estamos discutiendo la 7a edición de UNIX ™ aquí), y rmdir(1)
era (por necesidad) un programa raíz SUID que usaba el unlink(2)
Sistema de llamada para eliminar directorios.
Los manuales de la 7ª edición de UNIX están disponibles en línea en http://cm.bell-labs.com/7thEdMan (última verificación 2017-04-23); También están disponibles en http://plan9.bell-labs.com/7thEdMan (última verificada 2017-04-23). También parece haber al menos una fuente alternativa en línea - http://wolfram.schneider.org/bsd/7thEdManVol2/ - para los artículos del Volumen 2, con un enlace a la FreeBSD sitio para los comandos y llamadas al sistema en el Volumen 1.
los rm
comando (un programa regular que no es SUID) invocó el rmdir(1)
comando para eliminar los directorios vacíos. No podía hacerlo por sí mismo; que requería privilegios de root. Entonces el rmdir(1)
comando (ver aquí para su código fuente en Unix V7) existía para eliminar directorios vacíos, y la rm
El comando no eliminó los directorios vacíos.
Usar rm
Para eliminar directorios, tienes que dar la -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)
deshacer que mkdir(1)
hizo. Además son (en estos días) simples deportistas del rmdir(2)
y mkdir(2)
llamadas al sistema - sí, de vuelta en la 7 ª edición de UNIX, mkdir(1)
También fue un programa raíz SUID, usando el mknod(2)
llamar para crear un nodo de directorio y la link(2)
llama para crear el .
y ..
Entradas en el directorio.
fsck(1)
Es el que sobrevivió.
"rm" no funciona en directorios. Debe usar rmdir o especificar el modificador -r para una eliminación recursiva. La razón es histórica: unlink
y rmdir
Son llamadas separadas del sistema y han sido desde los primeros días de Unix.
rmdir(2)
ni mkdir(2)
existió como una llamada al sistema; usuario root
podría usar el mknod(2)
llamar para crear un nodo de directorio y la link(2)
llama para crear el .
y ..
entradas en el directorio; y root
podría usar el unlink(2)
Llame para eliminar las entradas del directorio.
También rmdir solo quita vacío directorios Si desea asegurarse de no eliminar ningún archivo adicional en un directorio, rmdir
es mas seguro que rm -r
(excepto si tiene un alias rm tal que siempre necesita confirmar lo que elimina, es decir, alias rm='rm -i'
en ~ / .bashrc o lo que esté utilizando).
También, rmdir
facilita la eliminación de directorios vacíos con expresiones de globbing (comodines).
Por ejemplo, para eliminar todos los directorios vacíos en /tmp
Sin tocar ningún archivo o directorio con contenido:
cd /tmp ; rmdir *
rmdir /tmp/*
. Si el /tmp
El directorio es realmente grande, esto podría quedarse sin espacio para discusiones un poco más rápido debido a los cinco caracteres adicionales por nombre, pero no requiere la cd
moviéndote por la jerarquía de directorios También vale la pena considerarlo rmdir /tmp/* 2>/dev/null
para evitar ver los mensajes de error (normalmente habrá muchos, y casi todos serán irrelevantes para la tarea en cuestión).