Я использую BSD и Linux каждый день, у меня никогда не было обстоятельства, при котором я должен использовать rmdir (1), а не rm (1). Какова цель существования rmdir?
Я использую BSD и Linux каждый день, у меня никогда не было обстоятельства, при котором я должен использовать rmdir (1), а не rm (1). Какова цель существования rmdir?
Ответы:
Основная причина, вероятно, историческая. В старые, старые времена не было 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)команду для удаления пустых каталогов. Он не мог сделать это сам; это требовало привилегий root. Таким образом, rmdir(1)команда (см. Здесь ее исходный код в Unix V7) существовала для удаления пустых каталогов, а сама rmкоманда не удаляла пустые каталоги.
Чтобы использовать rmдля удаления каталогов, вы должны дать -rвозможность.
Есть также аргумент симметрии. Вам нужна команда mkdir(1)для создания каталогов; кажется разумным иметь команду rmdir(1)отменить то, что mkdir(1)сделал. Кроме того, они являются ( в эти дни) простое exercisors этого самые rmdir(2)и mkdir(2)системных вызовов - да еще в 7 - е издание UNIX, mkdir(1)также является SUID корень программа, используя mknod(2)вызов для создания узла каталогов и link(2)вызова для создания .и ..записи в каталоге ,
fsck(1)это тот, который выжил.
«rm» не работает с каталогами. Вы должны либо использовать rmdir, либо указать ключ -r для рекурсивного удаления. Причина в том , историческое: unlinkи rmdirотдельные системные вызовы и были с первых дней Unix.
rmdir(2)не mkdir(2)существовало; пользователь rootможет использовать mknod(2)вызов для создания узла каталогов и link(2)вызова для создания .и ..записи в каталоге; и rootможет использовать unlink(2)вызов, чтобы удалить записи каталога.
Также rmdir удаляет только пустые каталоги. Если вы хотите убедиться, что вы не удаляете какие-либо дополнительные файлы в каталоге, rmdirэто более безопасно, чем rm -r(кроме случаев, когда вы добавили псевдоним rm, так что вам всегда нужно подтверждать, что вы удаляете, то есть alias rm='rm -i'в ~ / .bashrc или в том, что вы используете ).
Кроме того, rmdirпозволяет легко удалять пустые каталоги с выражениями-подстановками (подстановочными знаками). Например, чтобы удалить все пустые каталоги, /tmpне касаясь файлов или каталогов с содержимым:
cd /tmp ; rmdir *
rmdir /tmp/*. Если /tmpкаталог действительно большой, для аргументов может не хватить места немного быстрее из-за дополнительных пяти символов на имя, но это не требует cdперемещения по иерархии каталогов. Также стоит подумать о том, rmdir /tmp/* 2>/dev/nullчтобы не видеть сообщений об ошибках (обычно их будет много, и почти все они не будут иметь отношения к выполнению этой задачи).