Я использую BSD и Linux каждый день, у меня никогда не было обстоятельства, при котором я должен использовать rmdir(1), а не rm(1). Какова цель существования rmdir?
4 ответа
Основная причина, вероятно, историческая. В старые, старые времена не было системных вызовов 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)
для создания .
и ..
записи в каталоге.
"rm" не работает с каталогами. Вы должны либо использовать rmdir, либо указать ключ -r для рекурсивного удаления. Причина историческая: unlink
и rmdir
являются отдельными системными вызовами и были с ранних дней Unix.
Также rmdir удаляет только пустые каталоги. Если вы хотите убедиться, что вы не удаляете какие-либо дополнительные файлы в каталоге, rmdir
более безопасен, чем rm -r
(кроме случаев, когда вы использовали псевдоним rm, так что вам всегда нужно подтверждать то, что вы удаляете, то есть alias rm='rm -i'
в ~/.bashrc или что вы используете).
Кроме того, rmdir
позволяет легко удалять пустые каталоги с выражениями globbing (wildcard).
Например, чтобы удалить все пустые каталоги в /tmp
не касаясь файлов или каталогов с содержимым:
cd /tmp ; rmdir *