Tại sao không đệ quy đi lên với rm?


13

Tôi đang tự hỏi về hướng đệ quy nói chung và rm nói riêng.

rm đệ quy chỉ hoạt động xuống đúng?

Đang chạy: sudo rm -R *.QTFSsẽ xóa tất cả các tệp * .QTFS trong thư mục hiện tại và các tệp con của nó, đúng không?

thư mục hiện tại như được hiển thị bởi ls -lhacũng chứa ...các liên kết vì thiếu một từ tốt hơn, vậy tại sao đệ quy không theo những từ này trở lên trong cây thư mục? Có giới hạn nhân tạo trên ứng dụng rm hay không ...có thật không?


5
Bởi vì gốc rễ và sự điên rồ, cách đó nằm ...
jasonwryan


1
Chà, vì một giai thoại thú vị ... Tôi đã chạy rm -rf trên một số thư mục con trông ngây thơ tại một thời điểm chỉ để thấy sự kinh hoàng của tôi rằng một người dùng có liên kết cứng ở đó với một thượng nguồn rất quan trọng, sau đó rm đã tiếp tục ăn. Vâng, tôi đã có các bản sao lưu hiện tại và không có dữ liệu nào bị mất, nhưng hãy để nó là một câu chuyện cảnh báo ... :-)
Brian Knoblauch

@BrianKnoblauch, có thể làm hại gì bằng cách xóa một liên kết cứng? Tôi đã không hiểu được câu chuyện của bạn ...
Alexey

@Alexey Điểm chính là liên kết cứng không bị xóa. Nó đệ quy xuống thư mục được liên kết cứng, được liên kết đến một điểm cao hơn trong hệ thống tập tin, vì vậy bắt đầu ăn dữ liệu của mọi người ...
Brian Knoblauch

Câu trả lời:


18

rm đệ quy chỉ hoạt động trở xuống đúng?

rm -r x ysẽ xóa xymọi thứ bên trong chúng (nếu chúng là thư mục), nhưng không phải cha mẹ của chúng hoặc bất cứ thứ gì bên ngoài chúng.

Đang chạy: sudo rm -R *.QTFSsẽ xóa tất cả các tệp * .QTFS trong thư mục hiện tại và các tệp con của nó, đúng không?

Không. Nó sẽ xóa tất cả các tệp có tên *.QTFS, mọi tệp đệ quy bên trong các thư mục được gọi *.QTFSvà chính các thư mục đó. Nếu bạn muốn hành vi xóa khác, sử dụng find -delete.

thư mục hiện tại như được hiển thị bởi ls -lhacũng chứa ...các liên kết vì thiếu một từ tốt hơn, vậy tại sao đệ quy không theo những từ này trở lên trong cây thư mục? Có giới hạn nhân tạo trên ứng dụng rm hay không ...có thật không?

Đó là một giới hạn nhân tạo của rm.

Tuy nhiên, đó không thực sự là giả tạo - đó là cách duy nhất nó có thể hoạt động. Nếu rmtheo các ..liên kết cha , mọi thứ rm -rsẽ xóa mọi tệp trên hệ thống, bằng cách làm theo tất cả các ..liên kết trở lại /. rmnhìn thấy ...các mục trong mỗi thư mục khi nó liệt kê nội dung và bỏ qua chúng vì lý do đó.

Trên thực tế, bạn có thể thử nó. Chạy rm -r .và hầu hết các rmtriển khai sẽ từ chối hành động, báo cáo lỗi rõ ràng:

$ rm -r .
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’

(thông báo đó là từ GNUrm ; những người khác cũng tương tự). Khi nó gặp các mục này một cách ngầm định, thay vì các đối số rõ ràng, nó chỉ bỏ qua chúng và tiếp tục. Hành vi đó được yêu cầu bởi POSIX . Trong GNU rmvà nhiều BSD, nó được cung cấp tự động bởi fts_readhọ các hàm phân cấp-truyền tải.

hoặc ...không phải là điều thật không?

...chung mục thư mục thật, mặc dù đó là hệ thống tập tin cụ thể. Chúng hầu như sẽ luôn được trình bày như thể chúng là các mục thực sự cho tất cả mã người dùng, bất kể. Nhiều phần mềm (không chỉ rm) trong trường hợp đặc biệt hành vi của họ để bắt hoặc ngăn chặn đệ quy chạy trốn hoặc không mong muốn.


Đối với bất kỳ ai đang tìm kiếm bằng chứng (hoặc chỉ quan tâm đơn giản), hãy xem cách thực hiện điều này trong lõi core GNU .
Chris Hayes

@ChrisHayes Liên kết gitweb tương đương có trong câu trả lời. Tuy nhiên, trường hợp đệ quy thực tế là trong fts_readtriển khai, đó là một trường hợp chỉ dành cho các đối số dòng lệnh.
Michael Homer

@MichaelHomer Oh wow, vậy là xong. Màu liên kết đó không nổi bật trên sơ đồ SE này. Lỗi của tôi.
Chris Hayes

2
Câu trả lời này đúng nhưng cũng hơi thiếu chính xác. rmthậm chí không nhìn thấy *.QTFSbởi vì nó được mở rộng toàn cầu thành tên tệp bằng cách bash trước khi nhị phân rm được gọi. @ tobyink 'câu trả lời lưu ý rằng.
Daenyth

Là một sidenote, những ...hành vi đặc biệt hợp cụ thể được cho là nguyên nhân của sự tồn tại dotfiles
mgarciaisaia

5

Cũng như những gì Michael Homer đã viết, có một yếu tố khác khiến bạn khó có thể vô tình tái phạm vào thư mục gốc.

Đi vào thư mục nhà của bạn và gõ một cái gì đó như:

echo *s*

Bạn sẽ thấy rằng nó hiển thị một danh sách các tập tin và thư mục chứa chữ "s". Tuy nhiên, không có tệp nào bắt đầu bằng dấu chấm hàng đầu được hiển thị. Để hiển thị chúng, bạn có thể sử dụng:

echo .*s*

Điều này là do vỏ từ chối mở rộng * để bao gồm một dấu chấm hàng đầu. Điều này có nghĩa rằng:

rm -fr *

Sẽ không tái diễn vào ...

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.