14

Я использую BSD и Linux каждый день, у меня никогда не было обстоятельства, при котором я должен использовать rmdir(1), а не rm(1). Какова цель существования rmdir?

4 ответа4

24

Основная причина, вероятно, историческая. В старые, старые времена не было системных вызовов rmdir(2) и mkdir(2) (мы обсуждаем 7-е издание UNIX ™ здесь), а rmdir(1) был (по необходимости) корневой программой SUID, которая использовала системный вызов 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) для удаления пустых каталогов. Он не мог сделать это сам; для этого требуются права суперпользователя. Таким образом, команда rmdir(1) (см. Здесь ее исходный код в Unix V7) существовала для удаления пустых каталогов, а команда rm сама не удаляла пустые каталоги.

Чтобы использовать rm для удаления каталогов, вы должны указать опцию -r .

Есть также аргумент симметрии. Вам нужна команда mkdir(1) для создания каталогов; кажется разумным иметь команду rmdir(1) чтобы отменить то, что сделал mkdir(1) . Кроме того, они (в наши дни) являются простыми исполнителями системных вызовов rmdir(2) и mkdir(2) - да, в 7-м выпуске UNIX mkdir(1) также была корневой программой SUID, используя вызов mknod(2) создать узел каталога и вызов link(2) для создания . и .. записи в каталоге.

6

"rm" не работает с каталогами. Вы должны либо использовать rmdir, либо указать ключ -r для рекурсивного удаления. Причина историческая: unlink и rmdir являются отдельными системными вызовами и были с ранних дней Unix.

3

Также rmdir удаляет только пустые каталоги. Если вы хотите убедиться, что вы не удаляете какие-либо дополнительные файлы в каталоге, rmdir более безопасен, чем rm -r (кроме случаев, когда вы использовали псевдоним rm, так что вам всегда нужно подтверждать то, что вы удаляете, то есть alias rm='rm -i' в ~/.bashrc или что вы используете).

1

Кроме того, rmdir позволяет легко удалять пустые каталоги с выражениями globbing (wildcard). Например, чтобы удалить все пустые каталоги в /tmp не касаясь файлов или каталогов с содержимым:

cd /tmp ; rmdir *

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .