Я использую BSD и Linux каждый день, у меня никогда не было обстоятельств, когда я должен был использовать rmdir(1) вместо rm(1). В чем смысл существования rmdir?
решение1
Главная причина, вероятно, историческая. В старые-старые времена не было системных вызовов rmdir(2)
и mkdir(2)
(мы обсуждаем здесь 7-е издание UNIX™), и rmdir(1)
была (по необходимости) программа SUID root, которая использовала unlink(2)
системный вызов для удаления каталогов.
Руководства по UNIX 7-го издания доступны в Интернете по адресуhttp://cm.bell-labs.com/7thEdMan(последняя проверка 2017-04-23); Они также доступны наhttp://plan9.bell-labs.com/7thEdMan(последняя проверка 2017-04-23). Также, похоже, есть по крайней мере один альтернативный источник в сети —http://wolfram.schneider.org/bsd/7thEdManVol2/— для статей во 2-м томе, со ссылкой наFreeBSDсайт для команд и системных вызовов в Томе 1.
Команда rm
(обычная не SUID-программа) вызвала rmdir(1)
команду на удаление пустых каталогов. Она не могла сделать это сама; для этого требовались привилегии root. Поэтому команда rmdir(1)
(см.здесьдля его исходного кода в Unix V7) существовала возможность удаления пустых каталогов, и rm
сама команда не удаляла пустые каталоги.
Чтобы использовать rm
функцию удаления каталогов, необходимо предоставить соответствующую -r
опцию.
Есть также аргумент симметрии. Вам нужна команда mkdir(1)
для создания каталогов; кажется разумным иметь команду rmdir(1)
для отмены того, что mkdir(1)
было сделано. Плюс они (в наши дни) являются простыми исполнителями системных вызовов rmdir(2)
и mkdir(2)
— да, еще в 7-м издании UNIX, mkdir(1)
была также программа SUID root, использующая mknod(2)
вызов для создания узла каталога и link(2)
вызов для создания записей .
и ..
в каталоге.
решение2
"rm" не работает с каталогами. Вам нужно либо использовать rmdir, либо указать ключ -r для рекурсивного удаления. Причина историческая: unlink
и rmdir
являются отдельными системными вызовами и существуют с ранних дней Unix.
решение3
Также rmdir удаляет толькопустойкаталоги. Если вы хотите быть уверены, что не удалите никаких дополнительных файлов в каталоге, rmdir
это более безопасно, чем rm -r
(за исключением случая, когда вы создали псевдоним rm таким образом, что вам всегда нужно подтверждать, что вы удаляете, например, alias rm='rm -i'
в ~/.bashrc или там, где вы используете).
решение4
Также, rmdir
позволяет легко удалять пустые каталоги с помощью выражений подстановки (wildcard). Например, чтобы удалить все пустые каталоги, /tmp
не трогая файлы или каталоги с содержимым:
cd /tmp ; rmdir *