Tại sao nó là rm -rf chứ không phải rmdir -rf


13

Tôi luôn tò mò tại sao lệnh xóa mọi thứ trong một thư mục là rm -rf.

Tại sao không có cờ để làm điều tương tự rmdir?

Nó sẽ không trực quan hơn để sử dụng rmdircho các hoạt động thư mục?


9
rmdirxóa thư mục, rmxóa. Tại sao nó sẽ trực quan rmdirđể loại bỏ các thư mục không?
Stéphane Chazelas

5
Bởi vì nó không phải là. Bạn trễ 40 tuổi khi hỏi câu hỏi này và bạn đang hỏi nhầm người.
dùng207421

Câu trả lời:


25

Trong hệ thống tệp Unix đầu tiên (ít nhất là trong các thư mục V7 ngày khoảng năm 1970) đã được triển khai dưới dạng các tệp đặc biệt và chỉ root mới có thể sử dụng lệnh mknod(2)gọi hệ thống đã tạo ra chúng và chỉ root mới có thể tạo unlink(2)một tệp đặc biệt cho thư mục.

Những biện pháp bảo vệ này được đưa ra để giữ cho cấu trúc hệ thống tập tin nhất quán. Ví dụ: nếu người dùng được phép ghi vào một tệp đặc biệt của thư mục, anh ta có thể làm cho thư mục mẹ của nó ..trỏ đến chính nó (cụ thể là nút i của chính nó). Điều này sẽ tạo ra một tham chiếu vòng tròn trong hệ thống tập tin sẽ là một điều xấu. Tất nhiên có những mâu thuẫn khác người ta có thể làm, đây chỉ là một ví dụ rõ ràng.

Tính nhất quán được duy trì bởi các chương trình không gian người dùng như mkdir(1)rmdir(1)gốc Set-UID để họ có thể thực hiện các cuộc gọi hệ thống đặc quyền thay mặt cho người dùng không có đặc quyền. Khi đệ quy được thêm vào rm(1), lệnh remove sẽ chạy như UID hiện tại và sau đó gọi ra rmdir(1)chỉ để xóa các thư mục trống. Đây vẫn là một phương pháp nâng cao quyền tiêu chuẩn khá: không sử dụng nhiều quyền hơn bạn cần.

Một thời gian sau mkdir(2)rmdir(2)được thêm vào như các cuộc gọi hệ thống của riêng họ nhưng mối quan hệ giữa rm(1)rmdir(1)vẫn còn.

Cá nhân, tôi thấy nó hài lòng hơn rmdir junkvà biết rằng điều tồi tệ nhất tôi đã làm là xóa một thư mục trống.


1
Câu cuối cùng: Có lẽ, nếu thao tác xóa đệ quy được đưa vào rmdir, nó vẫn sẽ cần một -rcờ. ( rmdir -r junkthay vì rm -r junkrmdir junkvẫn chỉ hoạt động nếu thư mục trống)
user253751

7

Đó là lịch sử. rmđã được thực hiện để loại bỏ các tham chiếu đến các tập tin, rmdirđược thực hiện để loại bỏ các thư mục, song song với mkdir. Nhiều năm trước, Unix rmchỉ có thể xóa các thư mục bằng cách gọi rmdir. Cũng không có một rmdir(2)cuộc gọi hệ thống, rmdirlà một chương trình được gọi unlink(2).

Người giới thiệu:


2

Hoàn toàn là một vấn đề quan điểm, nhưng rmloại bỏ các tập tin trong khi rmdirloại bỏ các thư mục. Thư mục là một tệp, nhưng là một loại tệp đặc biệt, vì vậy sẽ rất hợp lý rmkhi xóa chúng, nhưng phải xử lý chúng đặc biệt (nghĩa là yêu cầu thêm tùy chọn để bật khả năng.) Mặt khác, không phải tất cả các tệp đều là thư mục, và nó không có ý nghĩa IMHO rmdirđể loại bỏ một cái gì đó không phải là một thư mục.


1
Nếu đó là trường hợp, tại sao không thể rmxóa một thư mục trống (ngoại trừ trong chế độ đệ quy)?
dùng253751

Cùng một lý do nó không thể xóa một thư mục đầy đủ - nó yêu cầu -rcờ để kích hoạt tính năng tệp đặc biệt của thư mục.
Darwin von Corax

1
Lý do thông tư ở đó ...
user253751

Tôi muốn nói lý luận của tôi có một sự lập dị >> 1 ...
Darwin von Corax
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.