¿Cuál es la razón por la que rmdir (1) y rm (1) coexisten?

Respuestas:

24

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.

Jonathan Leffler
fuente
aha todo esto tiene sentido, genial!
2
Bonito. Acabo de verificar una copia de 3BSD que tengo aquí y tampoco hay documentación para un rmdir syscall, y rmdir (1) aún se implementa mediante el uso de Unink.
Andy Ross
4
Una desventaja importante del sistema mknod + link and desvinculación fue que crear un directorio no era una operación atómica, por lo que podría terminar con un directorio parcialmente completo. Hubo muchos programas diseñados para verificar los sistemas de archivos en busca de las inconsistencias que surgieron; fsck(1) Es el que sobrevivió.
Jonathan Leffler
@Jonathan, trayendo recuerdos de Xenix en eso. Que asco Sí, podrían pasar cosas muy malas.
Fiasco Labs
6

"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.

Andy Ross
fuente
4
Un efecto secundario feliz es que es un poco menos probable que elimine accidentalmente un directorio cuando intenta eliminar solo un archivo.
Gracias. Noté que "rm -r" y "rmdir" tienen la misma cantidad de pulsaciones de teclas. ¿Existe rmdir únicamente por razones históricas (... siendo compatible con programas Unix de décadas de antigüedad)?
2
En realidad, en los primeros días de Unix, tampoco 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.
Jonathan Leffler
3

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).

Simon A. Eugster
fuente
1

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 *
Pat
fuente
Considere usar 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).
Jonathan Leffler