Я использую 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
чтобы не видеть сообщений об ошибках (обычно их будет много, и почти все они не будут иметь отношения к выполнению этой задачи).