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и знаю, что худшее, что я сделал, это удалил пустой каталог.
По последнему предложению: Предположительно, если бы выполнялась рекурсивная операция удаления rmdir, ей все равно нужен был бы -rфлаг. ( rmdir -r junkвместо rm -r junk, и rmdir junkвсе еще работает, только если каталог пуст)
user253751
7
Это исторически. rmбыл сделан для удаления ссылок на файлы, rmdirбыл сделан для удаления каталогов, параллельно mkdir. Много лет назад Unixrm мог удалять каталоги только путем вызова rmdir. Также не было rmdir(2)системного вызова, rmdirбыла программа, которая вызывала unlink(2).
Чисто дело мнения, но rmудаляет файлы, а rmdirудаляет каталоги. Каталог - это файл, но особый тип файла, поэтому имеет смысл rmудалить их, но обращаться с ними особым образом (т. Е. Требовать дополнительную опцию для включения возможности.) С другой стороны, не все файлы являются каталогами, и не имеет смысла ИМХО для rmdirудаления чего-то, что не является каталогом.
rmdir
удаляет каталоги,rm
удаляет. Почему было бы интуитивно понятноrmdir
удалить не каталоги?Ответы:
В ранней 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
и знаю, что худшее, что я сделал, это удалил пустой каталог.источник
rmdir
, ей все равно нужен был бы-r
флаг. (rmdir -r junk
вместоrm -r junk
, иrmdir junk
все еще работает, только если каталог пуст)Это исторически.
rm
был сделан для удаления ссылок на файлы,rmdir
был сделан для удаления каталогов, параллельноmkdir
. Много лет назад Unixrm
мог удалять каталоги только путем вызоваrmdir
. Также не былоrmdir(2)
системного вызова,rmdir
была программа, которая вызывалаunlink(2)
.Ссылки:
источник
Чисто дело мнения, но
rm
удаляет файлы, аrmdir
удаляет каталоги. Каталог - это файл, но особый тип файла, поэтому имеет смыслrm
удалить их, но обращаться с ними особым образом (т. Е. Требовать дополнительную опцию для включения возможности.) С другой стороны, не все файлы являются каталогами, и не имеет смысла ИМХО дляrmdir
удаления чего-то, что не является каталогом.источник
rm
удалить пустой каталог (кроме как в рекурсивном режиме)?-r
флаг, чтобы включить функцию специальных файлов каталога.