Tại sao tôi không thể xóa '.' danh mục?


40

Tôi đã thử xóa '.' danh mục. Tôi nghĩ rằng tôi chỉ có thể xóa thư mục làm việc của tôi mà không cần phải đi vào một thư mục cha.

Điểm của câu hỏi của tôi là tìm kiếm một số cái nhìn sâu sắc về cách hệ thống linux hoạt động để xóa các tập tin.


1
Hãy thử rm -r 'pwd' để xóa thư mục hiện tại mà không thực sự chuyển sang thư mục gốc
faadi

7
Câu hỏi này không trùng lặp câu hỏi đó. Người ta hỏi tại sao liên kết cứng tồn tại như một thực thể vật lý, thay vì được tổng hợp. Câu hỏi này không chỉ hỏi tại sao rm .rmdir .không hoạt động, mà tại sao chúng được chỉ định là không hoạt động, độc lập với sự tồn tại vật lý của một liên kết cứng.
JdeBP

9
Hình ảnh bạn đã trèo lên cây để cắt cành. Bạn ngồi ở phía nào của vết cắt khi bạn bắt đầu nhìn thấy? (Đó là hệ thống tệp Linux một cách ngắn gọn.)
michael

7
Hãy tưởng tượng rm -rf .*chỉ làm điều này để tìm thấy điều này bao gồm không chỉ .mà còn .., và sau đó ../.., sau đó là
Lít

Câu trả lời:


89

Xóa thư mục hiện tại không ảnh hưởng đến tính toàn vẹn của hệ thống tệp hoặc tổ chức logic của nó. Ngăn chặn .loại bỏ được thực hiện theo tiêu chuẩn POSIX được nêu trong rmdir(2)trang hướng dẫn:

Nếu đối số đường dẫn đề cập đến một đường dẫn có thành phần cuối cùng là dấu chấm hoặc dấu chấm, thì rmdir () sẽ thất bại.

Một lý do có thể được tìm thấy trong rmtrang hướng dẫn:

Tiện ích rm bị cấm xóa dấu chấm và dấu chấm để tránh hậu quả của việc vô tình làm một việc như:

rm -r. *

Mặt khác, loại bỏ rõ ràng thư mục hiện tại (nghĩa là bằng cách nêu đường dẫn đầy đủ hoặc tương đối của nó) là một hoạt động được phép trong Unix, ít nhất là kể từ SVR3 vì nó bị cấm với phiên bản Unix 7 cho đến SVR2. Điều này rất giống với những gì xảy ra khi bạn xóa một tệp đang tích cực được đọc hoặc ghi vào. Các quá trình truy cập tệp xóa tiếp tục các hoạt động đọc và ghi của chúng giống như nếu không có gì xảy ra. Sau khi bạn đã loại bỏ một thư mục hiện tại quá trình, thư mục này không thể truy cập được nữa mặc dù đường dẫn của nó nhưng inode của nó vẫn hiện diện trên hệ thống tệp cho đến khi quá trình chết hoặc thay đổi thư mục riêng của nó.

Lưu ý rằng quá trình sẽ không thể sử dụng một đường dẫn liên quan đến thư mục hiện tại của nó để thay đổi cwd của nó (ví dụ cd ..) vì không còn ..mục nào trong thư mục hiện tại của nó.

Khi loại một ai đó rmdir ., họ có thể mong đợi sự xâm nhập thư mục hiện hành phải được loại bỏ nhưng khi một thư mục được lấy ra (sử dụng đường đi của nó), ba mục thư mục đang thực sự loại bỏ, ., .., và thư mục riêng của mình.

Chỉ xóa .và không phải mục nhập thư mục của thư mục này sẽ tạo ra một thư mục không tuân thủ nhưng như đã nêu, nó bị cấm theo tiêu chuẩn.

Như @Emmanuel đã chỉ ra một cách đúng đắn, có một lý do thứ hai tại sao loại bỏ .không được phép. Có ít nhất một HĐH tuân thủ POSIX (Mac OS X với HFS +), với những hạn chế mạnh mẽ, hỗ trợ tạo liên kết cứng đến các thư mục hiện có. Trong trường hợp như vậy, không có cách rõ ràng từ bên trong thư mục để biết liên kết cứng nào là dự kiến ​​sẽ bị xóa.


9
pubs.opengroup.org/onlinepub/9699919799/fifts/rmdir.html "Ý nghĩa của việc xóa tên đường dẫn / dấu chấm là không rõ ràng, vì tên của tệp (thư mục) trong thư mục mẹ sẽ bị xóa của nhiều liên kết đến một thư mục "
Emmanuel

@Emmanuel Việc xóa một thư mục có nhiều hơn hai liên kết (nghĩa là không trống) đã bị cấm bởi thiết kế (thư mục không trống). Một thư mục có số lượng liên kết bị cấm theo tiêu chuẩn (ít nhất là với các hệ thống tệp trong đó số lượng liên kết có ý nghĩa).
jlliagre

3
@jlliagre: Đây không phải là câu hỏi về thư mục chứa nhiều liên kết, mà là thư mục nhiều liên kết. Một số hệ thống tập tin và / hoặc hệ điều hành không cho phép điều này, nhưng không phải tất cả.
Jörg W Mittag

@ JörgWMittag Một thư mục chứa nhiều thư mục nhiều liên kết theo thiết kế, bởi vì tất cả các thư mục con của nó ..liên kết với nó. Đây là trường hợp duy nhất của link count > 2phần lớn các hệ điều hành và hệ thống tệp, vì vậy "một số hệ thống tệp và / hoặc hệ điều hành" là một cách đánh giá thấp. Ngoại lệ duy nhất không có lịch sử là Mac OS X với HFS + có thêm các hạn chế về ai và những gì có thể được thực hiện mặc dù. Cấp nhận xét POSIX được hướng đến sự kỳ quặc này. Xem unix.stackexchange.com/questions/22394/ Cách
jlliagre

Này, tôi đã làm rm -r .*trước đây và nó đã thổi bay mọi thứ trong thư mục mẹ một cách đệ quy ... Đó là hơn một hoặc hai thập kỷ trước nhưng thật tuyệt khi biết rmkhông còn cho phép điều này nữa.
antak

9

Nó được thực hiện như thế vì tính toàn vẹn vì bạn hiện đang ở trong thư mục đó và .chỉ là một tài liệu tự tham khảo.

Bạn cần phải đi trong cha mẹ của nó hoặc gọi rmdirvới đường dẫn của nó, có thể được thực hiện với:

rmdir `pwd`

Nếu bạn thường cần điều đó, bạn có thể đặt bí danh cho nó như:

alias rmc='rmdir `pwd`'

.. có thể được gọi là rmcmột mình để loại bỏ thư mục hiện tại.


13
Nhưng tại sao / làm thế nào để rmdir .lệnh giả định thỏa hiệp tính toàn vẹn của hệ thống tệp theo cách đó rmdir $(pwd)hay rmdir "$PWD"không?
G-Man nói 'Phục hồi Monica'

4
Đây không phải là vấn đề về tính toàn vẹn của FS mà là của tổ chức logic. Khi bạn chọn thư mục hiện tại của mình, bạn bảo shell sử dụng thư mục này cho các hoạt động sắp tới của bạn, nhưng bạn không thể xóa cái gì đó khỏi chính nó.
Julie Pelletier

7
Tôi sợ nó có vẻ phỏng đoán.
Emmanuel

4
@FranklinPiat Tôi không thấy nhận xét của bạn đặc biệt hữu ích: 1. OP đã sử dụng ở đâu rm *và ý nghĩa của lịch sử shell là gì? 2. Câu trả lời giải quyết phần tại sao , 3. Quan tâm đến công phu?
JBentley

4
@ G-Man nếu bạn làm như vậy rmdir $(pwd), pwdví dụ /foo/bar/baz, tìm ra một tên logic cho thư mục hiện tại , và sau đó rmdir, nhìn thấy đường dẫn đó, xóa bazmục nhập khỏi /foo/barthư mục, với điều kiện được đáp ứng. Điều này thật ý nghĩa. Mặt khác rmdir ., lệnh là một lệnh để loại bỏ .mục nhập khỏi thư mục hiện tại, điều này không được phép (nó sẽ vi phạm ràng buộc rằng mọi thư mục đều có một .mục nhập vào chính nó) cũng không hữu ích (nó sẽ không xóa liên kết bạn muốn loại bỏ).
hobbs
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.