Lý do để rmdir (1) và rm (1) cùng tồn tại là gì?


17

Tôi sử dụng BSD và Linux mỗi ngày, tôi chưa bao giờ gặp phải trường hợp nào tôi phải sử dụng rmdir (1) thay vì rm (1). Mục đích tồn tại của rmdir là gì?


2
OT, nhưng, FWIW, điều này cho thấy cách sử dụng thú vị (và khác biệt): cyberciti.biz/faq/linux-unix-remove-directory
pst

Câu trả lời:


27

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)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 rmlệ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à rmlệ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 -rtù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 ...các mục trong thư mục .


aha tất cả điều này có ý nghĩa, tuyệt vời!

2
Đẹp. Tôi vừa kiểm tra một bản sao 3BSD tôi có ở đây và không có tài liệu nào cho một tòa nhà rmdir ở đó, và rmdir (1) vẫn được triển khai bằng cách sử dụng hủy liên kết.
Andy Ross

4
Một nhược điểm lớn của hệ thống liên kết và hủy liên kết mknod + là việc tạo một thư mục không phải là một hoạt động nguyên tử, do đó bạn có thể kết thúc với một thư mục hoàn chỉnh một phần. Có rất nhiều chương trình được đưa ra để kiểm tra các hệ thống tệp cho sự không nhất quán phát sinh; fsck(1)là người sống sót
Jonathan Leffler

@Jonathan, mang lại những ký ức về Xenix về điều đó. Kinh quá! Vâng, những điều thực sự tồi tệ có thể xảy ra.
Phòng thí nghiệm Fiasco

6

"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ử: unlinkrmdirlà các cuộc gọi hệ thống riêng biệt và đã có từ những ngày đầu của Unix.


4
Một tác dụng phụ hạnh phúc là bạn ít có khả năng vô tình xóa một thư mục khi bạn có ý định chỉ xóa một tệp.

Cảm ơn bạn. Tôi nhận thấy rằng "rm -r" và "rmdir" có cùng số lượng các nét chính. Liệu rmdir tồn tại hoàn toàn vì lý do lịch sử (.. tương thích với các chương trình Unix cũ hàng thập kỷ)?

2
Trên thực tế, trở lại thời kỳ đầu của Unix, không phải 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 rootcó 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 ...các mục trong thư mục; và rootcó thể sử dụng lệnh unlink(2)gọi để loại bỏ các mục trong thư mục.
Jonathan Leffler

3

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, rmdirsẽ 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 ).


1

Ngoài ra, rmdirlà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 /tmpmà 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 *

Cân nhắc sử dụng rmdir /tmp/*. Nếu /tmpthư 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 cdbạ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).
Jonathan Leffler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.