Làm thế nào tôi có thể xóa một thư mục có nhiều thư mục con nhanh chóng?


15

Tôi có một thư mục với 266778 thư mục con. Làm thế nào tôi có thể xóa nó?

Tôi đã thử

cd ~/.local/share/Trash/
sudo rm -rf *

nhưng nó mất nhiều thời gian Sau 1 phút 25 giây thời gian thực và 0,072 giây thời gian người dùng, nó chỉ xóa 2500 thư mục. Bằng cách này, sẽ mất hơn hai giờ để xóa thư mục này.

Có cách nào nhanh hơn để xóa thư mục này? Tại sao có sự khác biệt lớn như vậy giữa thời gian người dùng và thời gian thực?

real    1m25.474s
user    0m0.072s
sys     0m28.142s

Tôi sử dụng Linux 2.6.32 (Ubuntu 10.04.4 LTS).


Tôi vừa giải quyết vấn đề này và có vẻ như một số người đã phát hiện ra rằng rsync có thể được sử dụng như một công cụ "xóa nhiều tệp" khá hiệu quả. Cho dù nó thực sự là nhanh hơn vẫn còn tùy thuộc vào bạn để đánh giá.
Johan

2
Đối với những gì nó có giá trị: hiệu suất khi xóa nhiều thư mục / tệp phụ thuộc nhiều vào hệ thống tệp. Theo kinh nghiệm của tôi, sự khác biệt khi xóa hàng triệu tệp nhỏ trên ext3 (chậm) so với XFS (nhanh) có thể là hàng giờ.
pdo

Nếu bạn thường gặp trường hợp này và bạn có thể lên kế hoạch trước, sử dụng một hệ thống tệp như btrfs và sử dụng một subvolume, bạn có thể tăng tốc mọi thứ nhanh chóng chỉ bằng cách loại bỏ subvolume đó.
PlasmaHH

Đây là nơi bạn có thể tìm thấy câu trả lời. Một perl là nhanh nhất. unix.stackexchange.com/questions/37329/ từ
SDsolar

Câu trả lời:


17

Nếu phiên bản "tìm" của bạn thực hiện lệnh phụ -delete, thì bạn có thể thử

find directory -delete

Trong trường hợp này:

find ~/.local/share/Trash/ -delete

Một số lệnh, như rm, thực hiện hầu hết công việc của chúng trong kernel. Trong các thói quen hệ thống tập tin, chính xác. Thời gian thực hiện các cuộc gọi hệ thống được tính theo cách đó, do đó, trong khi lệnh "rm" của bạn chạy trong một thời gian dài, nó không thực hiện được nhiều công việc trong vùng đất người dùng - các cuộc gọi hệ thống thực hiện hầu hết công việc.


+1; mặc dù điều này cũng xóa thư mục gốc và tôi nghi ngờ OP chỉ muốn xóa nội dung của thư mục Thùng rác chứ không phải chính thư mục đó
don_crissti

1
@don_crissti: nhận xét tốt. nếu OP muốn chỉ xóa các thư mục con trong ~ / .local / share / Thùng rác (và không phải các tệp ở cấp 1), thì: find ~/.local/share/Trash/*/ -delete (tất nhiên, điều này cũng sẽ xóa các tệp (và thư mục) trong bất kỳ Thùng rác nào / * / subirs là tốt)
Olivier Dulac

2
+1 để giải thích hành vi kỳ quặc củatime
Martin Thoma

3
find directory -deletethực sự nhanh hơn rm -rf directory? Rốt cuộc, họ thực hiện cùng một công việc, và không có hai cách để làm điều đó.
Gilles 'SO- ngừng trở thành ác quỷ'

1
@Johan tìm thấy là thực sự nhanh chóng. Bạn đã bao giờ có cơ hội để tìm hiểu lý do?
Harshdeep

20

Nó phụ thuộc vào định nghĩa của bạn nhanh . Các câu trả lời đã có ở đây đưa ra một giải pháp tốt để thực sự loại bỏ các thư mục khỏi hệ thống tệp, nhưng nếu điều bạn thực sự cần là giải phóng tên thư mục càng nhanh càng tốt, thì việc đổi tên trên cùng một hệ thống tệp là tức thời:

{ mv directory directory.gone && rm -rf directory.gone; } &

Về mặt kỹ thuật, điều này là gian lận vì tôi đã không tăng tốc độ xóa thực tế, nhưng thực tế nó rất hữu ích: Tôi sử dụng thủ thuật này mọi lúc nên tôi không phải chờ các hoạt động xóa chậm.


Tuyệt quá. Trường hợp sử dụng của bạn để làm điều này tất cả các thời gian là gì? Nếu bạn làm điều đó nhiều, sẽ không có nguy hiểm bạn sẽ tồn đọng, nhận nhiều 'thư mục.gone và thất bại? Tôi đoán bạn sử dụng một hậu tố như '$$' hoặc '% (ngày ...)'
smci

1
Nếu tôi cần có lẽ tôi có thể sử dụng mktemp với các đối số đảm bảo nó vẫn nằm trên cùng một hệ thống tệp. Nhưng tôi không thể nói rằng tôi có một ví dụ cụ thể ngay bây giờ.
kojiro

kojiro vâng cảm ơn, mktemplà những gì tôi đã cố nhớ ...
smci

1

rm -rf directoryhoặc rm -rf *tất nhiên là phương pháp nhanh nhất trừ khi rmviệc thực hiện cục bộ của bạn bị hỏng.

Sử dụng findkhông cho lợi thế.

Việc này nhanh hay chậm chủ yếu phụ thuộc vào hệ thống tập tin và hệ điều hành. Vì vậy, câu hỏi dường như không phù hợp.

UFS và ZFS trên Solaris được biết là rất nhanh với loại nhiệm vụ như cả hai triển khai hệ thống tập tin bao gồm chậm nền đang xóa gây ra unlink()rmdir()các cuộc gọi trở lại nhanh ngay cả khi đối tượng liên quan sẽ mất nhiều thời gian hơn trong tổng số.

Với việc xóa nền bị trì hoãn trong kernel, việc cập nhật thư mục cũng có thể được thực hiện nhanh chóng và điều này giúp tăng tốc toàn bộ hoạt động.


Trong khi người ta có thể được tha thứ vì nghĩ rằng, điều này thực sự không đúng, như câu trả lời này mô tả.
Hitechcomputergeek

0

Đây chỉ là một câu trả lời một phần, làm sáng tỏ ba giá trị mà lệnh trả về; trích dẫn từ time(1)trang này :

(i) thời gian thực trôi qua giữa việc gọi và kết thúc, (ii) thời gian CPU của người dùng (tổng của các giá trị tms_utimevà được trả về bởi ) và (iii) thời gian CPU của hệ thống (tổng của và các giá trị trong một như được trả lại bởi ). "tms_cutimestruct tmstimes(2)tms_stimetms_cstimestruct tmstimes(2)

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.