¿Cuál es la razón por la que rmdir (1) y rm (1) coexisten?
14
Uso BSD y Linux todos los días, nunca he tenido una circunstancia que deba usar rmdir (1) en lugar de rm (1). ¿Cuál es el propósito de la existencia de rmdir?
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 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.
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.
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).
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:
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).
Respuestas:
La razón principal es probablemente histórica. En los viejos tiempos, no había
rmdir(2)
ymkdir(2)
llamadas al sistema (estamos discutiendo la 7a edición de UNIX ™ aquí), yrmdir(1)
era (por necesidad) un programa raíz SUID que usaba elunlink(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ó elrmdir(1)
comando para eliminar los directorios vacíos. No podía hacerlo por sí mismo; que requería privilegios de root. Entonces elrmdir(1)
comando (ver aquí para su código fuente en Unix V7) existía para eliminar directorios vacíos, y larm
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 comandormdir(1)
deshacer quemkdir(1)
hizo. Además son (en estos días) simples deportistas delrmdir(2)
ymkdir(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 elmknod(2)
llamar para crear un nodo de directorio y lalink(2)
llama para crear el.
y..
Entradas en el directorio.fuente
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
yrmdir
Son llamadas separadas del sistema y han sido desde los primeros días de Unix.fuente
rmdir(2)
nimkdir(2)
existió como una llamada al sistema; usuarioroot
podría usar elmknod(2)
llamar para crear un nodo de directorio y lalink(2)
llama para crear el.
y..
entradas en el directorio; yroot
podría usar elunlink(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 querm -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).fuente
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:fuente
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 lacd
moviéndote por la jerarquía de directorios También vale la pena considerarlormdir /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).