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