Я использую BSD и Linux каждый день, у меня никогда не было обстоятельства, при котором я должен использовать rmdir (1), а не rm (1). Какова цель существования rmdir?
Основная причина, вероятно, историческая. В старые, старые времена не было rmdir(2)и mkdir(2)системных вызовов (здесь мы обсуждаем 7-е издание UNIX ™), и rmdir(1)была (по необходимости) корневая программа SUID, которая использовала unlink(2)системный вызов для удаления каталогов.
Команда 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)вызова для создания .и ..записи в каталоге ,
Ницца. Я только что проверил копию 3BSD, которую я имею здесь, и там нет документации для системного вызова rmdir, и rmdir (1) все еще реализован с использованием unlink.
Энди Росс
4
Одним из основных недостатков системы mknod + link и unlink было то, что создание каталога не было атомарной операцией, поэтому вы можете получить частично полный каталог. Было разработано много программ для проверки файловых систем на наличие несоответствий; fsck(1)это тот, который выжил.
Джонатан Леффлер
@ Джонатан, вспоминая о Ксениксе. Тьфу! Да, действительно плохие вещи могут случиться.
Fiasco Labs
6
«rm» не работает с каталогами. Вы должны либо использовать rmdir, либо указать ключ -r для рекурсивного удаления. Причина в том , историческое: unlinkи rmdirотдельные системные вызовы и были с первых дней Unix.
Приятным побочным эффектом является то, что у вас немного меньше шансов случайно удалить каталог, если вы собираетесь удалить только файл.
Спасибо. Я заметил, что «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 или в том, что вы используете ).
Кроме того, rmdirпозволяет легко удалять пустые каталоги с выражениями-подстановками (подстановочными знаками). Например, чтобы удалить все пустые каталоги, /tmpне касаясь файлов или каталогов с содержимым:
Подумайте об использовании rmdir /tmp/*. Если /tmpкаталог действительно большой, для аргументов может не хватить места немного быстрее из-за дополнительных пяти символов на имя, но это не требует cdперемещения по иерархии каталогов. Также стоит подумать о том, rmdir /tmp/* 2>/dev/nullчтобы не видеть сообщений об ошибках (обычно их будет много, и почти все они не будут иметь отношения к выполнению этой задачи).
Ответы:
Основная причина, вероятно, историческая. В старые, старые времена не было
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
не касаясь файлов или каталогов с содержимым:источник
rmdir /tmp/*
. Если/tmp
каталог действительно большой, для аргументов может не хватить места немного быстрее из-за дополнительных пяти символов на имя, но это не требуетcd
перемещения по иерархии каталогов. Также стоит подумать о том,rmdir /tmp/* 2>/dev/null
чтобы не видеть сообщений об ошибках (обычно их будет много, и почти все они не будут иметь отношения к выполнению этой задачи).