Làm thế nào để rm -r đi về loại bỏ đệ quy? Theo thứ tự?


30

Có một số thứ tự của hoạt động để rm? Tôi đã thực hiện rmtrên một thư mục lớn và tò mò nơi tôi nên xem để xem những gì có thể đã bị xóa. Có rmhoạt động trên các tập tin đầu tiên, sau đó các thư mục? Hoặc nó dựa trên một số thông tin trong bảng inode?

Thông số kỹ thuật: rm từ hệ thống GNU coreutils 8.22: Arch Linux chạy trên hệ thống tập tin beagleboneblack hoạt động trên là một ổ cứng Seagate (ext4) bên ngoài sử dụng USB 2.0.

Cơ sở:

Tôi đã thực hiện một số dọn dẹp thư mục và thực hiện

cp -r A/ B/ C/ Dest/

Vô tình, tôi theo dõi nó với

rm -r A/ B/ C/ Dest/

khi tôi chỉ đơn giản là thực hiện

rm -r A/ B/ C/

Tôi bắt được nó và nhấn Ctrl+ Ctrước khi quá lâu đã trôi qua. Cụ thể, đó là <3 giây khi tôi đang sử dụng timelệnh kết hợp với rm& cp. Tôi đã đi vào và kiểm tra với Dest/hy vọng nó không tồn tại, nhưng lo và thấy nó là toàn bộ và dường như không bị ảnh hưởng. Đây là một chút ngạc nhiên vì A/ B/ C/khá nhỏ. Có thể tổng cộng 100200200 MB. Dest/tuy nhiên, chỉ khoảng 1TB. Thực hiện lstrên Dest / cho thấy có cả tệp và thư mục ở cả hai đầu của bảng chữ cái (ví dụ AFile.txt.... .... Zoo.txt).

Tôi có được may mắn và hủy bỏ rmtrước khi nó tàn phá trong thư mục Dest / của tôi không? Có rmthực sự là chậm (rất may!)?

Nếu không, làm thế nào để rmloại bỏ đệ quy những thứ mà tôi có thể đoán những gì có thể đã bị mất?

Tôi không thực sự mong đợi để phục hồi những gì tôi có thể đã mất, chỉ tò mò những gì có khả năng bị thổi bay.


Câu trả lời:


34

rm -rlần lượt làm việc trên từng đối số của nó. Nếu một đối số là một thư mục, nó sẽ liệt kê thư mục (với các hàm opendirreaddirhàm hoặc một số phương thức tương đương) và lần lượt hoạt động trên mỗi mục nhập. Nếu một mục là một thư mục, nó khám phá mục đó một cách đệ quy.

Đây chính là phương pháp tương tự mà các ứng dụng khác sử dụng vào thư mục traverse đệ quy - find, ls -Rfvv

Thứ tự truyền tải là không thể đoán trước. Trên hầu hết các hệ thống tệp, thứ tự có thể được sao chép miễn là không có tệp nào được thêm, xóa hoặc đổi tên trong thư mục (theo lý thuyết, thứ tự có thể hoàn toàn ngẫu nhiên và thay đổi mỗi lần, nhưng tôi không thể nghĩ đến hệ thống tệp xảy ra). Trên một vài hệ thống tệp, nói chung, thứ tự có thể được suy ra từ tên tệp hoặc từ thứ tự các tệp được tạo hoặc kết hợp cả hai, nhưng bạn cần biết chi tiết tốt của hệ thống tệp và nó có thể thay đổi tùy theo phiên bản trình điều khiển. Thứ tự truyền tải không phải là thứ bạn có thể dựa vào.

Lưu ý rằng lshoặc echo *sắp xếp các tệp theo thứ tự từ điển của tên của chúng. findls -f không sắp xếp.

Một điều bạn có thể dựa vào là các đối số được xử lý theo thứ tự. Vì vậy, nếu C/vẫn còn một phần ở đó, nó có nghĩa Dest/là không bị ảnh hưởng. Nếu C/không còn nữa, bạn có thể biết được nơi các tệp đã bị xóa Dest/bằng cách kiểm tra thời gian sửa đổi thư mục và so sánh chúng với thời gian C/đã bị xóa hoặc thời gian sao chép kết thúc. Các tập tin đầu tiên bị xóa có thể là một tập tin trực tiếp trong Dest/hoặc ở một nơi sâu trong hệ thống phân cấp tùy thuộc vào việc mục đầu tiên trong Dest/đó rmđã xảy ra với traverse là một thư mục hay không.

Tốc độ rmchủ yếu là vấn đề có bao nhiêu tập tin cần phải xóa. Phải mất một tệp rất lớn để có tác động đáng chú ý đến thời gian xóa. Phần lớn công việc lần lượt xóa từng mục nhập thư mục. Dữ liệu của tệp không bị xóa, xóa nội dung của tệp chỉ yêu cầu đánh dấu các khối mà nó đang sử dụng là miễn phí, tương đối nhanh.


2
Các -ftùy chọn lslà tài liệu là tương đương với -aU, nơi -aphương tiện liệt kê tất cả các tập tin và -Uphương tiện được phân loại. Tôi mơ hồ nhớ lại đã gặp một phiên bản lstrong đó -fkhông hoạt động (tôi nghĩ nó được định nghĩa là một cái gì đó khác) nhưng -aUđã làm.
G-Man nói 'Phục hồi Monica'

2
@ G-Man POSIX định nghĩa -f(dưới dạng tiện ích mở rộng XSI ); Nó thực sự có tác dụng khác ngoài việc sắp xếp. Nó quay trở lại V7, vì vậy bạn sẽ khó có thể tìm thấy một triển khai mà không có nó, thật lạ, BusyBox. -Uvì chỉ chưa được sắp xếp là một tính năng GNU, tôi không nghĩ nó tồn tại ở bất kỳ nơi nào khác.
Gilles 'SO- ngừng trở nên xấu xa'


@Tim số Bạn có thể kiểm tra bằng cách chạy ls -Utrong một thư mục. Đây là cùng một thứ tự rm -rsẽ làm việc trong thư mục đó. Lưu ý rằng việc thêm hoặc xóa một tệp có thể thay đổi thứ tự của các tệp khác.
Gilles 'SO- ngừng trở nên xấu xa'

Cảm ơn. (1) "thêm hoặc xóa một tập tin có thể thay đổi thứ tự của các tập tin khác.", Vì vậy sau khi vô tình xóa một phần, ls -Ukhông giúp tìm ra liệu các thư mục còn sống có bị ảnh hưởng không? (2) -U có nghĩa là "danh sách các mục theo thứ tự thư mục". Liệu -U có nghĩa là thứ tự của các mục trong thư mục?
Tim

5

Như Gilles nói, bạn thường không thể dự đoán thứ tự xóa trong một thư mục, chỉ có điều các thư mục cấp cao nhất sẽ được xử lý theo thứ tự trên dòng lệnh.

Tuy nhiên, bạn cũng được đảm bảo rằng nó sẽ xóa phân cấp thư mục từ dưới lên, bởi vì Unix chỉ cho phép xóa các thư mục nếu chúng trống. Vì vậy, để xóa một thư mục, trước tiên nó phải xóa mọi thứ trong đó. Nếu nó chứa các thư mục con, nó phải xóa nội dung của chúng trước, v.v.

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.