По какой причине сосуществуют rmdir(1) и rm(1)?
Я использую 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 *