Odpowiedzi:
Głównym powodem jest prawdopodobnie historyczny. Powrót do dawnych, dawnych czasach, tam nie byli rmdir(2)
i mkdir(2)
wywołania systemowe (mówimy o 7th Edition UNIX ™ tutaj), i rmdir(1)
był (z konieczności) program korzeń SUID że użył unlink(2)
wywołania systemowego usunięcia katalogów.
Instrukcje UNIX 7. edycji są dostępne online pod adresem http://cm.bell-labs.com/7thEdMan (ostatnio sprawdzone 23.04.2017); Są one również dostępne na stronie http://plan9.bell-labs.com/7thEdMan (ostatnio sprawdzono 23.04.2017). Wydaje się również, że istnieje co najmniej jedno alternatywne źródło online - http://wolfram.schneider.org/bsd/7thEdManVol2/ - dla artykułów w Tomie 2, z linkiem do strony FreeBSD dla poleceń i wywołań systemowych w Tomie 1 .
rm
Poleceń (regularnym programem non-SUID) powołuje się na rmdir(1)
komendę w celu usunięcia pustych katalogów. Nie mógł tego zrobić sam; wymagało to uprawnień roota. Tak więc rmdir(1)
polecenie (patrz tutaj jego kod źródłowy w Uniksie V7) istniało w celu usunięcia pustych katalogów, a samo rm
polecenie nie usunęło pustych katalogów.
Aby użyć rm
do usunięcia katalogów, musisz podać -r
opcję.
Istnieje również argument symetrii. Potrzebujesz polecenia, mkdir(1)
aby utworzyć katalogi; wydaje się rozsądne mieć polecenie rmdir(1)
cofnięcia tego, co mkdir(1)
zrobiono. Dodatkowo są one (obecnie) prostymi ćwiczeniami wywołań systemowych rmdir(2)
i mkdir(2)
- tak, w 7. edycji UNIX, mkdir(1)
był także programem głównym SUID, wykorzystującym mknod(2)
wywołanie do utworzenia węzła katalogu i link(2)
wywołanie do utworzenia pozycji .
i ..
wpisów w katalogu .
fsck(1)
to ten, który przeżył.
„rm” nie działa na katalogach. Musisz użyć rmdir lub określić przełącznik -r w celu usunięcia rekurencyjnego. Powodem jest historyczny: unlink
a rmdir
to oddzielne wywołania systemowe i zostały od pierwszych dni Unix.
rmdir(2)
nie mkdir(2)
istniało jako wywołanie systemowe; użytkownik root
może użyć mknod(2)
wywołania, aby utworzyć węzeł katalogu i link(2)
wywołania, aby utworzyć wpisy .
i ..
w katalogu; i root
może użyć unlink(2)
połączenia, aby usunąć wpisy z książki telefonicznej.
Również rmdir usuwa tylko puste katalogi. Jeśli chcesz mieć pewność, że nie usuniesz żadnych dodatkowych plików w katalogu, rmdir
jest to bezpieczniejsze niż rm -r
(z wyjątkiem przypadku aliasu rm tak, że zawsze musisz potwierdzić to, co usuwasz, np. alias rm='rm -i'
W ~ / .bashrc lub cokolwiek, którego używasz ).
Również rmdir
ułatwia usuwanie pustych katalogów z globbing (wieloznacznych) wyrażenia. Na przykład, aby usunąć wszystkie puste katalogi /tmp
bez dotykania plików lub katalogów z zawartością:
cd /tmp ; rmdir *
rmdir /tmp/*
. Jeśli /tmp
katalog jest naprawdę duży, może zabraknąć miejsca na argumenty nieco ze względu na dodatkowe pięć znaków na nazwę, ale nie wymaga cd
przenoszenia się w hierarchii katalogów. Warto również rozważyć rmdir /tmp/* 2>/dev/null
unikanie komunikatów o błędach (zwykle będzie ich dużo i prawie wszystkie z nich nie będą miały znaczenia dla tego zadania).