Відповіді:
Основна причина, мабуть, історична. Ще в старі часи не було 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)виклику для створення .та ..записів у каталозі. .
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щоб не бачити повідомлень про помилки (їх зазвичай буде багато, і майже всі вони не матимуть ніякого значення для цього завдання).