Câu trả lời:
Lý do chính có lẽ là lịch sử. Quay lại thời xưa, ngày xưa, không có cuộc gọi rmdir(2)
và mkdir(2)
hệ thống nào (chúng ta đang thảo luận về phiên bản thứ 7 UNIX ™ ở đây) và rmdir(1)
(là cần thiết) một chương trình gốc SUID sử dụng lệnh unlink(2)
gọi hệ thống để xóa thư mục.
Hướng dẫn sử dụng UNIX phiên bản thứ 7 có sẵn trực tuyến tại http://cm.bell-labs.com/7thEdMan (kiểm tra lần cuối 2017-04-23); Chúng cũng có sẵn tại http://plan9.bell-labs.com/7thEdMan (kiểm tra lần cuối 2017-04-23). Dường như cũng có ít nhất một nguồn thay thế trực tuyến - http://wolfram.schneider.org/bsd/7thEdManVol2/ - cho các bài viết trong Tập 2, với liên kết đến trang FreeBSD cho các lệnh và hệ thống gọi trong Tập 1 .
Các rm
lệnh (một chương trình phi SUID thường xuyên) gọi các rmdir(1)
lệnh để loại bỏ các thư mục rỗng. Nó không thể tự làm như vậy; yêu cầu quyền root. Vì vậy, rmdir(1)
lệnh (xem ở đây để biết mã nguồn của nó trong Unix V7) đã tồn tại để xóa các thư mục trống và rm
lệnh không tự xóa các thư mục trống.
Để sử dụng rm
để loại bỏ các thư mục, bạn phải cung cấp -r
tùy chọn.
Ngoài ra còn có một đối số đối xứng. Bạn cần một lệnh mkdir(1)
để tạo thư mục; Có vẻ hợp lý để có một lệnh rmdir(1)
để hoàn tác những gì mkdir(1)
đã làm. Thêm vào đó, họ là (những ngày này) những người thực hiện các cuộc gọi hệ thống rmdir(2)
và đơn giản mkdir(2)
- vâng, trở lại trong phiên bản thứ 7 UNIX, mkdir(1)
cũng là một chương trình gốc SUID, sử dụng lệnh mknod(2)
gọi để tạo nút thư mục và lệnh link(2)
gọi để tạo .
và ..
các mục trong thư mục .
fsck(1)
là người sống sót
"rm" không hoạt động trên các thư mục. Bạn phải sử dụng rmdir hoặc chỉ định khóa -r để xóa đệ quy. Lý do là lịch sử: unlink
và rmdir
là các cuộc gọi hệ thống riêng biệt và đã có từ những ngày đầu của Unix.
rmdir(2)
cũng không mkdir(2)
tồn tại như một cuộc gọi hệ thống; người dùng root
có thể sử dụng lệnh mknod(2)
gọi để tạo nút thư mục và lệnh link(2)
gọi để tạo .
và ..
các mục trong thư mục; và root
có thể sử dụng lệnh unlink(2)
gọi để loại bỏ các mục trong thư mục.
Ngoài ra rmdir chỉ loại bỏ các thư mục trống . Nếu bạn muốn đảm bảo rằng bạn không xóa bất kỳ tệp bổ sung nào trong một thư mục, rmdir
sẽ an toàn hơn rm -r
(trừ khi bạn đặt bí danh rm sao cho bạn luôn cần xác nhận những gì bạn xóa, tức là alias rm='rm -i'
trong ~ / .bashrc hoặc bất cứ điều gì bạn đang sử dụng ).
Ngoài ra, rmdir
làm cho nó dễ dàng để loại bỏ các thư mục trống với các biểu thức globalbing (ký tự đại diện). Ví dụ: để xóa tất cả các thư mục trống trong /tmp
mà không chạm vào bất kỳ tệp hoặc thư mục nào có nội dung:
cd /tmp ; rmdir *
rmdir /tmp/*
. Nếu /tmp
thư mục thực sự lớn, điều này có thể hết dung lượng cho các đối số nhanh hơn một chút do có thêm năm ký tự cho mỗi tên, nhưng nó không yêu cầu cd
bạn di chuyển xung quanh hệ thống phân cấp thư mục. Cũng đáng để xem xét rmdir /tmp/* 2>/dev/null
để tránh nhìn thấy các thông báo lỗi (thường sẽ có rất nhiều và hầu như tất cả chúng sẽ không liên quan đến nhiệm vụ đó trong tay).