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

17

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

Говард
источник
2
ОТ, но, FWIW, это показывает интересное (и различное) использование: cyberciti.biz/faq/linux-unix-remove-directory
pst

Ответы:

27

Основная причина, вероятно, историческая. В старые, старые времена не было 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)вызова для создания .и ..записи в каталоге ,

Джонатан Леффлер
источник
Ага! все это имеет смысл, отлично!
2
Ницца. Я только что проверил копию 3BSD, которую я имею здесь, и там нет документации для системного вызова rmdir, и rmdir (1) все еще реализован с использованием unlink.
Энди Росс
4
Одним из основных недостатков системы mknod + link и unlink было то, что создание каталога не было атомарной операцией, поэтому вы можете получить частично полный каталог. Было разработано много программ для проверки файловых систем на наличие несоответствий; fsck(1)это тот, который выжил.
Джонатан Леффлер
@ Джонатан, вспоминая о Ксениксе. Тьфу! Да, действительно плохие вещи могут случиться.
Fiasco Labs
6

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

Энди Росс
источник
4
Приятным побочным эффектом является то, что у вас немного меньше шансов случайно удалить каталог, если вы собираетесь удалить только файл.
Спасибо. Я заметил, что «rm -r» и «rmdir» имеют одинаковое количество нажатий клавиш. Существует ли rmdir исключительно по историческим причинам (... будучи совместимым с десятилетними программами Unix)?
2
На самом деле, еще в первые дни Unix, ни системный вызов , ни его rmdir(2)не mkdir(2)существовало; пользователь rootможет использовать mknod(2)вызов для создания узла каталогов и link(2)вызова для создания .и ..записи в каталоге; и rootможет использовать unlink(2)вызов, чтобы удалить записи каталога.
Джонатан Леффлер
3

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

Саймон А. Эугстер
источник
1

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

cd /tmp ; rmdir *
похлопывание
источник
Подумайте об использовании rmdir /tmp/*. Если /tmpкаталог действительно большой, для аргументов может не хватить места немного быстрее из-за дополнительных пяти символов на имя, но это не требует cdперемещения по иерархии каталогов. Также стоит подумать о том, rmdir /tmp/* 2>/dev/nullчтобы не видеть сообщений об ошибках (обычно их будет много, и почти все они не будут иметь отношения к выполнению этой задачи).
Джонатан Леффлер