У чому причина співіснування rmdir (1) та rm (1)?


17

Я використовую BSD та Linux щодня, у мене ніколи не було обставин, що я повинен використовувати rmdir (1), а не rm (1). Яка мета існування rmdir?


2
OT, але, FWIW, це показує цікаве (і різне) використання: cyberciti.biz/faq/linux-unix-remove-directory
pst

Відповіді:


27

Основна причина, мабуть, історична. Ще в старі часи не було rmdir(2)і mkdir(2)системних дзвінків (ми тут обговорюємо 7-е видання UNIX ™), і rmdir(1)була (необхідна) коренева програма SUID, яка використовувала unlink(2)системний виклик для видалення каталогів.

Посібники з 7-го видання UNIX доступні в Інтернеті за посиланням 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)команду для видалення порожніх каталогів. Він не міг цього зробити сам; що вимагало кореневих привілеїв. Отже, rmdir(1)команда (див. Тут її вихідний код в Unix V7) існувала для видалення порожніх каталогів, а сама rmкоманда не видаляла порожні каталоги.

Щоб використовувати rmдля видалення каталогів, ви повинні дати -rможливість.

Є також аргумент симетрії. Вам потрібна команда mkdir(1)для створення каталогів; здається розумним мати команду rmdir(1)скасувати те, що було mkdir(1)зроблено. Плюс вони (в ці дні) прості користувачі системних rmdir(2)і mkdir(2)системних викликів - так, ще в 7-му виданні UNIX, mkdir(1)була також кореневою програмою SUID, використовуючи mknod(2)виклик для створення вузла каталогу та link(2)виклику для створення .та ..записів у каталозі. .


ага! це все має сенс, чудово!

2
Приємно. Я щойно перевірив наявну тут копію 3BSD, і там немає жодної документації на syscall rmdir, і rmdir (1) все ще реалізований за допомогою від’єднання.
Енді Росс

4
Одним з головних недоліків системи mknod + link and unlink було те, що створення каталогу не було атомною операцією, тож ви могли отримати частково повний каталог. Було багато програм, розроблених для перевірки файлових систем на наявність невідповідностей; fsck(1)той, що вижив.
Джонатан Леффлер

@Jonathan, повертаючи спогади про Xenix про це. Гидота! Так, справді можуть трапитися погані речі.
Лабораторії Фіаско

6

"rm" не працює в каталогах. Вам потрібно або використовувати rmdir, або вказати перемикач -r для рекурсивного видалення. Причина в тому , історичне: unlinkі rmdirокремі системні виклики і були з перших днів Unix.


4
Приємним побічним ефектом є те, що ви трохи рідше випадково видаляєте каталог, коли ви збираєтесь видалити лише файл.

Дякую. Я помітив, що "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 або будь-якому іншому, що ви використовуєте. ).


1

Крім того, rmdirполегшується видалення порожніх каталогів з виразними (видовими) символами. Наприклад, для видалення всіх порожніх каталогів, /tmpне торкаючись жодних файлів чи каталогів із вмістом:

cd /tmp ; rmdir *

Подумайте про використання rmdir /tmp/*. Якщо /tmpкаталог дійсно великий, це може не вистачити місця для аргументів трохи швидше через додаткові п'ять символів на ім’я, але це не вимагає cdпереміщення вас по ієрархії каталогів. Також варто подумати, rmdir /tmp/* 2>/dev/nullщоб не бачити повідомлень про помилки (їх зазвичай буде багато, і майже всі вони не матимуть ніякого значення для цього завдання).
Джонатан Леффлер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.