В чем причина сосуществования rmdir(1) и rm(1)?

В чем причина сосуществования rmdir(1) и rm(1)?

Я использую 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 *

Связанный контент