Dlaczego jest to rm -rf, a nie rmdir -rf

13

Zawsze byłem ciekawy, dlaczego jest to polecenie usuwania wszystkiego z katalogu rm -rf.

Dlaczego nie ma flag, z którymi można by zrobić to samo rmdir?

Czy korzystanie rmdirz operacji na katalogach nie byłoby bardziej intuicyjne ?

kouroshk
źródło
9
rmdirusuwa katalogi, rmusuwa. Dlaczego rmdirusuwanie intuicyjnych katalogów byłoby intuicyjne ?
Stéphane Chazelas,
5
Ponieważ tak nie jest. Spóźniasz się 40 lat na zadawanie tego pytania i zadajesz niewłaściwym ludziom.
user207421,

Odpowiedzi:

25

We wczesnym Unixowym systemie plików (przynajmniej w czasach V7 około 1970 roku) katalogi były implementowane jako pliki specjalne i tylko root mógł korzystać z mknod(2)wywołania systemowego, które je utworzyło, a tylko root mógł unlink(2)mieć specjalny plik katalogu.

Te zabezpieczenia zostały wprowadzone, aby zachować spójność struktury systemu plików. Na przykład, jeśli użytkownik mógł zapisać w specjalnym pliku katalogu, mógłby sprawić, aby jego katalog nadrzędny ..wskazywał na siebie (w szczególności na własny i-węzeł). Spowodowałoby to utworzenie cyklicznego odwołania w systemie plików, co byłoby błędem. Oczywiście mogą istnieć inne niespójności, to tylko jasny przykład.

Konsystencja była utrzymywana przez programy przestrzeni użytkownika, jak mkdir(1)i rmdir(1)które były Set-UID korzeń, tak aby mogły one uprzywilejowanych wywołań systemowych w imieniu nieuprzywilejowany użytkownika. Po dodaniu rekurencji rm(1)polecenie remove działałoby jako bieżący identyfikator UID, a następnie wywoływało rmdir(1)wyłącznie w celu usunięcia pustych katalogów. Jest to nadal dość standardowa metoda podnoszenia uprawnień: nie używaj więcej uprawnień niż potrzebujesz.

Jakiś czas później mkdir(2)i rmdir(2)dodano jako własnych wywołań systemowych, ale z relacji rm(1)i rmdir(1)pozostaje.

Osobiście uważam to za odrobinę bardziej satysfakcjonujące rmdir junki wiem, że najgorsze, co zrobiłem, to usunięcie pustego katalogu.

msw
źródło
1
Re ostatnie zdanie: Przypuszczalnie, gdyby operacja usuwania rekurencyjnego była włączona rmdir, nadal potrzebowałaby -rflagi. ( rmdir -r junkzamiast rm -r junki rmdir junknadal działa tylko wtedy, gdy katalog jest pusty)
user253751
7

To jest historyczne. rmzostał stworzony, aby usunąć odniesienia do plików, rmdirzostał stworzony, aby usunąć katalogi równolegle do mkdir. Wiele lat temu Unix rmmógł usuwać katalogi tylko poprzez inwokację rmdir. Nie było też rmdir(2)wywołania systemowego, rmdirbył to program, który wywołał unlink(2).

Bibliografia:

Dee Hendrick
źródło
2

Jest to wyłącznie kwestia opinii, ale rmusuwa pliki, a rmdirkatalogi. Katalog jest plikiem, ale specjalnym typem pliku, dlatego warto rmje usuwać, ale traktować je specjalnie (tj. Wymagać dodatkowej opcji, aby włączyć tę funkcję). Z drugiej strony nie wszystkie pliki są katalogami, i IMHO nie ma sensu, rmdiraby usuwać coś, co nie jest katalogiem.

Darwin von Corax
źródło
1
Jeśli tak było, to dlaczego nie można rmusunąć pustego katalogu (z wyjątkiem trybu rekurencyjnego)?
user253751,
Z tego samego powodu nie może usunąć pełnego katalogu - wymaga -rflagi, aby włączyć funkcję specjalnego pliku katalogu.
Darwin von Corax,
1
Kołowe rozumowanie tam ...
user253751
Powiedziałbym, że moje rozumowanie jest ekscentryczne >> 1 ...
Darwin von Corax,