¿Por qué es rm -rf y no rmdir -rf?

13

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 rmdirpara las operaciones de directorio?

kouroshk
fuente
99
rmdirelimina directorios, rmelimina. ¿Por qué sería intuitivo rmdireliminar no directorios?
Stéphane Chazelas
55
Porque no lo es. Tienes 40 años de retraso haciendo esta pregunta, y le preguntas a las personas equivocadas.
user207421

Respuestas:

25

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 junky sé que lo peor que hice fue eliminar un directorio vacío.

msw
fuente
1
Re la última oración: Presumiblemente, si la operación de eliminación recursiva estuviera activa rmdir, todavía necesitaría una -rbandera. (en rmdir -r junklugar de rm -r junk, y rmdir junktodavía funciona si el directorio está vacío)
user253751
7

Es historico. rmse realizó para eliminar las referencias a los archivos, rmdirse realizó para eliminar directorios, en paralelo a mkdir. Hace muchos años, Unix rmsolo podía eliminar directorios invocando rmdir. Tampoco hubo una rmdir(2)llamada al sistema, rmdirfue un programa que llamó unlink(2).

Referencias

Dee Hendrick
fuente
2

Es pura cuestión de opinión, pero rmelimina archivos mientras rmdirelimina directorios. Un directorio es un archivo, pero un tipo especial de archivo, por lo que tiene sentido rmeliminarlos, 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 rmdireliminar algo que no es un directorio.

Darwin von Corax
fuente
1
Si ese fuera el caso, ¿por qué no se puede rmeliminar un directorio vacío (excepto en modo recursivo)?
user253751
La misma razón por la que no puede eliminar un directorio completo: requiere la -rmarca para habilitar la función de archivo especial de directorio.
Darwin von Corax
1
Razonamiento circular allí ...
user253751
Diría que mi razonamiento tiene una excentricidad >> 1 ...
Darwin von Corax