Чому це rm -rf, а не rmdir -rf


13

Мені завжди було цікаво, чому команда для видалення всього в каталозі rm -rf.

Чому немає прапорів, щоб зробити те саме rmdir?

Чи не було б інтуїтивніше використовувати rmdirдля операцій з каталогами?


9
rmdirвидаляє каталоги, rmвидаляє. Чому було б інтуїтивно зрозуміти rmdirвидалення не-каталогів?
Stéphane Chazelas

5
Тому що це не так. Ви запізнюєтесь на 40 років, ставлячи це запитання, і ви запитуєте неправильних людей.
user207421

Відповіді:


25

На початку файлової системи Unix (принаймні назад, за V7 днів до 1970 року) каталоги реалізовувались як спеціальні файли, і лише корінь міг використовувати mknod(2)системний виклик, який їх створив, і лише корінь міг unlink(2)мати спеціальний файл каталогу.

Ці засоби захисту існували для того, щоб підтримувати структуру файлової системи. Наприклад, якщо користувачеві було дозволено записувати в спеціальний файл каталогу, він може зробити його батьківський каталог ..вказувати на себе (конкретно на власний i-вузол). Це створило б циркулярну посилання у файловій системі, яка була б поганою річчю. Звичайно, є й інші невідповідності, які можна зробити, це лише чіткий приклад.

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

Через деякий час mkdir(2)і rmdir(2)були додані в якості своїх власних системних викликів , але співвідношення між rm(1)і rmdir(1)залишається.

Особисто мені здається, що це більше задовольняє rmdir junkта знаю, що найгірше, що я зробив, - це видалити порожній каталог.


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

7

Це історично. rmбуло зроблено для видалення посилань на файли, rmdirробилося для видалення каталогів, паралельних до mkdir. Багато років тому Unix rmміг видаляти каталоги лише шляхом виклику rmdir. Також не було rmdir(2)системного виклику, rmdirбула програма, яка дзвонила unlink(2).

Список літератури:


2

Зрозуміло, це питання, але rmвидаляє файли, rmdirвидаляючи каталоги. Каталог - це файл, але файл особливого типу, тому їх має сенс rmвидаляти, але обробляти їх спеціально (тобто вимагати додаткової опції для активації.) З іншого боку, не всі файли - це каталоги, і немає сенсу IMHO rmdirвидаляти щось, що не є каталогом.


1
Якщо це було так, то чому не можна rmвидалити порожній каталог (за винятком рекурсивного режиму)?
користувач253751

З тієї ж причини він не може видалити повний каталог - для цього потрібен -rпрапор, щоб увімкнути функцію спеціального файлу каталогу.
Дарвін фон Корак

1
Круглі міркування там ...
користувач253751

Я б сказав, що міркування мають ексцентричність >> 1 ...
Дарвін фон Корак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.