Почему это rm -rf, а не rmdir -rf

13

Мне всегда было любопытно, почему команда для удаления всего в каталоге rm -rf.

Почему нет флагов, чтобы сделать то же самое с rmdir?

Разве не было бы более интуитивно понятным использовать rmdirдля операций с каталогами?

kouroshk
источник
9
rmdirудаляет каталоги, rmудаляет. Почему было бы интуитивно понятно rmdirудалить не каталоги?
Стефан Шазелас
5
Потому что это не так. Вы опоздали на этот вопрос на 40 с лишним лет, и вы спрашиваете не тех людей.
user207421 13.12.15

Ответы:

25

В ранней Unix File System (по крайней мере, в V7-е годы около 1970 года) каталоги были реализованы как специальные файлы, и только root мог использовать mknod(2)системный вызов, который их создал, и только root могunlink(2) использовать специальный файл каталога.

Эти средства защиты были на месте, чтобы сохранить структуру файловой системы согласованной. Например, если пользователю было разрешено писать в специальный файл каталога, он мог бы сделать так, чтобы его родительский каталог ..указывал на себя (в частности, на свой собственный i-узел). Это создаст циклическую ссылку в файловой системе, которая будет плохой вещью. Конечно, существуют и другие несоответствия, это только яркий пример.

Согласованность поддерживалась программами пользовательского пространства, такими как mkdir(1)и rmdir(1)являющимися корневыми для Set-UID, чтобы они могли выполнять привилегированные системные вызовы от имени непривилегированного пользователя. Когда рекурсия была добавлена rm(1), команда удаления запускалась как текущий UID, а затем вызывала rmdir(1)только для удаления пустых каталогов. Это все еще довольно стандартный метод повышения разрешений: не используйте больше разрешений, чем вам нужно.

Некоторое время спустя mkdir(2)и rmdir(2)были добавлены как собственные системные вызовы, но отношения между так rm(1)и rmdir(1)остались.

Лично я нахожу это немного более удовлетворяющим rmdir junkи знаю, что худшее, что я сделал, это удалил пустой каталог.

MSW
источник
1
По последнему предложению: Предположительно, если бы выполнялась рекурсивная операция удаления rmdir, ей все равно нужен был бы -rфлаг. ( rmdir -r junkвместо rm -r junk, и rmdir junkвсе еще работает, только если каталог пуст)
user253751
7

Это исторически. rmбыл сделан для удаления ссылок на файлы, rmdirбыл сделан для удаления каталогов, параллельно mkdir. Много лет назад Unixrm мог удалять каталоги только путем вызова rmdir. Также не было rmdir(2)системного вызова, rmdirбыла программа, которая вызывала unlink(2).

Ссылки:

Ди Хендрик
источник
2

Чисто дело мнения, но rmудаляет файлы, а rmdirудаляет каталоги. Каталог - это файл, но особый тип файла, поэтому имеет смысл rmудалить их, но обращаться с ними особым образом (т. Е. Требовать дополнительную опцию для включения возможности.) С другой стороны, не все файлы являются каталогами, и не имеет смысла ИМХО для rmdirудаления чего-то, что не является каталогом.

Дарвин фон Коракс
источник
1
Если это так, то почему нельзя rmудалить пустой каталог (кроме как в рекурсивном режиме)?
user253751
По той же причине, по которой он не может удалить полный каталог - ему требуется -rфлаг, чтобы включить функцию специальных файлов каталога.
Дарвин фон Коракс
1
Круговые рассуждения там ...
user253751
Я бы сказал, что мои рассуждения имеют эксцентричность >> 1 ...
Дарвин фон Коракс