Liệu rm -rf * xóa các tệp đệ quy từ thư mục hiện tại hoặc thư mục gốc / thư mục gốc?


7

Tôi muốn xóa các tệp và thư mục đệ quy từ một thư mục cụ thể vì vậy tôi đã chạy lệnh này từ thư mục đó

rm -rf *

Tôi giả định rằng nó sẽ xóa tất cả các tệp / thư mục trong thư mục hiện tại theo cách đệ quy. Một cái gì đó tồi tệ đã xảy ra sau đó (máy chủ của tôi bị hỏng, thậm chí không nhận được phản hồi ping).


1
Không biết chính xác bạn đã thực hiện lệnh này ở đâu, thật khó để nói tại sao lại như vậy, nhưng có vẻ như bạn đã xóa một cái gì đó mà hệ thống của bạn cần để hoạt động. rm -rf *thực hiện khá nhiều như bạn nói (không bao gồm thực tế là nó bỏ qua các tập tin ẩn). Nói chung, tốt hơn là nên đi lên một thư mục và rm -rchính thư mục đó, tạo lại nó nếu cần thiết.
Chris Xuống

Tôi chỉ muốn biết nếu nó xóa tập tin / thư mục đệ quy dưới thư mục hiện tại hoặc root?
Windows

3
Nó chỉ làm như vậy trong thư mục hiện tại. Ngay cả khi bạn đã nhập .*, POSIX không cho phép liệt kê ...
Chris Xuống

3
Thậm chí rm -Rf --no-preserve-root /thường sẽ rời khỏi máy pingable. Nhân chạy từ RAM, nó tiếp tục chạy ngay cả khi (các) hệ thống tập tin bị phá hủy.
derobert

1
rm -rfsẽ không bao giờ xóa .hoặc .., ngay cả khi được nói rõ ràng với. Xem ở đây .
terdon

Câu trả lời:


11

Đừng quên khả năng máy chủ không thể truy cập được sau khi rmlệnh không liên quan gì đến điều đó. Nó có thể là một sự trùng hợp!

Mặc dù rất có thể, thư mục làm việc hiện tại không như bạn nghĩ, khi lệnh được ban hành.

Bạn đã root khi làm điều này?

Đây là những gì xảy ra khi ban hành lệnh rm -rf *:

  1. Shell giải quyết các mẫu ký tự đại diện ( *trong trường hợp này) cho tất cả các tệp (bao gồm các thư mục, liên kết tượng trưng và các tệp đặc biệt của thiết bị) phù hợp với mẫu hình cầu được sử dụng, trong trường hợp này mọi thứ không bắt đầu bằng .Thông thường, chúng được sắp xếp theo "bảng chữ cái" theo vỏ.
  2. Shell sau đó tạo ra một quy trình mới và exec()là phiên bản đầu tiên rmđược tìm thấy trong của bạn $PATH, với -rftư cách là đối số đầu tiên và các tệp được khớp, từng cái một làm các đối số liên tiếp.

Nếu lệnh rmđược gọi là rmlệnh tiêu chuẩn , trước tiên, nó phân tích cú pháp từng đối số, xử lý tất cả các đối số (bao gồm cả các đối số do shell shellbing) bắt đầu bằng một -tùy chọn cho đến khi nó xuất hiện một đối số không bắt đầu bằng -( ngoại trừ các lệnh sử dụng GNU getopt()chấp nhận các tùy chọn sau khi không có tùy chọn) hoặc một lệnh chính xác --. Tất cả mọi thứ sau đó được coi là tên tập tin.

Nói cách khác, nếu bạn có một tệp được gọi (ví dụ) --no-preserve-roottrong thư mục hiện tại, thì đó sẽ được hiểu là một tùy chọn rm, không phải là tên tệp để xóa!

Hãy cẩn thận với các ký tự đại diện (và với cách đặt tên tệp). Nếu bạn có một tệp được gọi -rtrong thư mục hiện tại, lệnh ls *sẽ liệt kê các tệp khác theo thứ tự ngược lại và không hiển thị tệp '-r'.

Nói cách khác, nếu bạn có một tệp được gọi --no-preserve-root, nó sẽ được chuyển qua dưới dạng tùy chọn rmchứ không phải là tên tệp.

Sử dụng rm -rf -- *để ngăn điều đó xảy ra và cũng loại bỏ các tệp bắt đầu bằng -. Hoặc đơn giản là sử dụng tên đường dẫn tuyệt đối hoặc tương đối để làm cho tên tệp bắt đầu bằng một cái gì đó khác -, như trong: rm ./--flagfilehoặc rm /abs/path/to/--flagfile.

Ngoài ra còn có một -icờ để rmlàm cho nó nhắc ("tương tác") trước khi xóa bất cứ điều gì.


2
Lưu ý rằng đó --là một tính năng GNU có thể không có trong tất cả các rmphiên bản. Cách khác để loại bỏ các tập tin được gọi -rrm ./-r. Tôi đề nghị đề cập đến điều này trong câu trả lời của bạn.
derobert

3
@derobert, không. --là POSIX, không phải GNU.
Stéphane Chazelas
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.