Siempre he tenido curiosidad por qué es el comando para eliminar todo en un directorio rm -rf
.
¿Por qué no hay banderas para hacer lo mismo rmdir
?
¿No sería más intuitivo de usar rmdir
para las operaciones de directorio?
Siempre he tenido curiosidad por qué es el comando para eliminar todo en un directorio rm -rf
.
¿Por qué no hay banderas para hacer lo mismo rmdir
?
¿No sería más intuitivo de usar rmdir
para las operaciones de directorio?
Respuestas:
Al principio del Sistema de archivos Unix (al menos en los días V7, alrededor de 1970), los directorios se implementaron como archivos especiales y solo root podía usar la mknod(2)
llamada al sistema que los creó y solo root podía unlink(2)
un archivo especial de directorio.
Estas protecciones estaban en su lugar para mantener la estructura del sistema de archivos consistente. Por ejemplo, si a un usuario se le permitiera escribir en un archivo especial de directorio, podría hacer que su directorio padre se ..
señalara a sí mismo (específicamente su propio nodo i). Esto crearía una referencia circular en el sistema de archivos que sería una mala cosa. Por supuesto, hay otras inconsistencias que uno podría hacer, este es solo un ejemplo claro.
La coherencia se mantuvo mediante programas de espacio de usuario como mkdir(1)
y rmdir(1)
que eran raíz Set-UID para que pudieran hacer las llamadas privilegiadas del sistema en nombre de un usuario no privilegiado. Cuando se agregaba la recursividad rm(1)
, el comando remove se ejecutaría como el UID actual y luego se llamaría rmdir(1)
únicamente para eliminar directorios vacíos. Este sigue siendo un método bastante estándar de elevación de permisos: no use más permisos de los que necesita.
Algún tiempo después mkdir(2)
y rmdir(2)
se agregaron como sus propias llamadas al sistema, pero la relación entre rm(1)
y rmdir(1)
permanece.
Personalmente, me parece un poco más satisfactorio rmdir junk
y sé que lo peor que hice fue eliminar un directorio vacío.
rmdir
, todavía necesitaría una -r
bandera. (en rmdir -r junk
lugar de rm -r junk
, y rmdir junk
todavía funciona si el directorio está vacío)
Es historico. rm
se realizó para eliminar las referencias a los archivos, rmdir
se realizó para eliminar directorios, en paralelo a mkdir
. Hace muchos años, Unix rm
solo podía eliminar directorios invocando rmdir
. Tampoco hubo una rmdir(2)
llamada al sistema, rmdir
fue un programa que llamó unlink(2)
.
Referencias
Es pura cuestión de opinión, pero rm
elimina archivos mientras rmdir
elimina directorios. Un directorio es un archivo, pero un tipo especial de archivo, por lo que tiene sentido rm
eliminarlos, pero tratarlos especialmente (es decir, requerir una opción adicional para habilitar la capacidad). Por otro lado, no todos los archivos son directorios, y no tiene sentido en mi humilde opinión para rmdir
eliminar algo que no es un directorio.
rm
eliminar un directorio vacío (excepto en modo recursivo)?
-r
marca para habilitar la función de archivo especial de directorio.
rmdir
elimina directorios,rm
elimina. ¿Por qué sería intuitivormdir
eliminar no directorios?