Có cách nào nhanh hơn để xóa một thư mục hơn là rm -rf không?


32

Tôi có một thư mục có nhiều tệp và "rm -rf" mất rất nhiều thời gian để hoàn thành. Có cách nào nhanh hơn để xóa một thư mục và nội dung của nó (thư mục con, v.v.) không?


Đối với bất kỳ ai quan tâm, hãy xem: slashroot.in/comment/1286#comment-1286 tìm trumps perl trumps rsync
Rinzwind

Câu trả lời:


33

Bạn có thể thử hủy liên kết inode cho thư mục nhưng điều đó sẽ khiến bạn phải tải toàn bộ tệp mồ côi fsck sẽ lật ra.

rm là tốt như nó được.


Một vài người đang đề cập đến các trường hợp cạnh trong đó một số thứ nhanh hơn những thứ khác. Nhưng hãy chắc chắn rằng chúng ta đang so sánh các phiên bản tốt nhất của cùng một thứ.

Nếu bạn muốn xóa một thư mục và mọi thứ trong đó, tôi đề nghị bạn:

rm -rf path/to/directory

rmsẽ liệt kê nội bộ các tập tin và thư mục mà nó sẽ xóa. Và đó là tất cả trong biên soạn C . Đó là hai lý do nhanh nhất.

Điều này rất rõ ràng không giống với rm -rf path/to/directory/*điều sẽ mở rộng ở cấp độ vỏ và truyền tải vô số đối số vào rm. Sau đó rmphải phân tích những cái đó và sau đó lặp lại từ mỗi. Điều đó chậm hơn nhiều.

Cũng giống như một "điểm chuẩn" so sánh find path/to/directory -exec {} \;là vô nghĩa. Nó chạy rmmột lần cho mỗi tệp nó tìm thấy. Quá chậm. Find có thể xây dựng các lệnh đối số theo kiểu xargs -exec rm {} +nhưng điều đó cũng chậm như mở rộng. Bạn có thể gọi -deletetrong đó sử dụng một unlinkcuộc gọi nội bộ đến kernel (giống như rmvậy) nhưng lúc đầu sẽ chỉ hoạt động cho các tệp.

Vì vậy, để lặp lại, trừ khi bạn ném đĩa vào magma nóng lỏng, rmlà vua .


Trên một lưu ý liên quan, các hệ thống tập tin khác nhau xóa mọi thứ ở các tỷ lệ khác nhau do cách chúng được cấu trúc. Nếu bạn đang làm điều này một cách thường xuyên, bạn có thể muốn lưu trữ các tệp này trong một phân vùng được định dạng trong XFS, có xu hướng xử lý việc xóa khá nhanh.

Hoặc sử dụng đĩa nhanh hơn. Nếu bạn có hàng tấn RAM, sử dụng /dev/shm(đĩa RAM) có thể là một ý tưởng.


Bạn thực sự không thể sử dụng lệnh unlinkgọi hệ thống trên các thư mục (bạn sẽ gặp EISDIRlỗi), vì vậy tùy chọn đầu tiên là không thể.
James Henstridge

Mv đến / tmp sẽ nhanh hơn? Có vẻ như mv cũng mất rất nhiều thời gian.
Mohammad Moghimi

@MohammadMoghimi: mving giữa các hệ thống tập tin / phân vùng khác nhau có nghĩa là cptheo sau bởi a rm.
enzotib

3
@enzotib Tuy nhiên, nếu /tmptrên cùng một hệ thống tập tin, tôi tự hỏi nếu mvvà khởi động lại sẽ nhanh hơn? Tôi không chắc chắn nếu /tmpđược xóa bằng cách rmnào.
Sparhawk

1
rsynctrong chuẩn này trường hợp là nhanh hơn rm -rf: web.archive.org/web/20130929001850/http://linuxnote.net/...
schmijos

11

Đôi khi, find $DIR_TO_DELETE -type f -deletenhanh hơn rm -rf.

Bạn cũng có thể muốn thử mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE.

Cuối cùng, nếu bạn cần xóa nội dung của toàn bộ phân vùng, nhanh nhất có thể sẽ là umount, mkfsvà lại mount.


1
không phải là type -fđể biểu thị một tập tin và không phải là một thư mục? Ngoài ra, thêm -printhiển thị các tập tin khi chúng đang bị xóa.
leetbacoon

8

Nếu bạn không cần không gian trống, cách nhanh nhất là trì hoãn việc xóa và thực hiện điều đó trong nền:

  • mkdir .delete_me
  • mv big-thư mục-đó-tôi-muốn-đi .delete_me

Sau đó, có một crontab làm điều đó trong nền, tại một thời điểm yên tĩnh, với tỷ lệ I / O thấp:

3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +

Ghi chú:

  • kiểm tra đầu ra của bạn trước khi loại bỏ tiếng vang trong crontab!
  • thư mục .delete_me phải nằm trong cùng một hệ thống tệp - trong trường hợp không rõ ràng đối với mọi người.

Cập nhật: Tôi đã tìm thấy một mẹo gọn gàng để chạy song song nhiều rm - điều này sẽ giúp ích nếu bạn có một mảng đĩa lớn:

ionice -c 3 nice find target_directory -depth -maxdepth 3 | xargs -d \n -P 5 -n 5 rm -rf
  • -depth để thực hiện một giao dịch theo chiều sâu.

  • -maxdepth để giới hạn độ sâu của truyền tải thư mục để chúng tôi không nghe các tệp riêng lẻ.

  • -d \ n để xử lý khoảng trắng trong tên tệp.

  • -P và -n xử lý mức độ song song (kiểm tra manpage).

ref: http://blog.liw.fi/posts/rm-is-too-slow/#comment-3e028c69183a348ee748d904a7474019

Cập nhật 2 (2018): Với ZFS được cung cấp cùng với Ubuntu 18.04, tôi sử dụng nó cho mọi thứ và tôi sẽ tạo một bộ dữ liệu mới cho bất kỳ dự án lớn nào. Nếu bạn có kế hoạch trước và làm điều này trước, bạn có thể chỉ cần "phá hủy" một hệ thống tập tin khi bạn hoàn thành. ;-)

Tôi đã sử dụng các hướng dẫn từ wiki zfsonlinux để cài đặt Ubuntu vào ZFS một cách tự nhiên: https://github.com/zfsonlinux/zfs/wiki/Ub Ubuntu-18.04-Root-on-ZFS


2
Thay vì lệnh cuối cùng, sử dụng find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf. Các -depthtùy chọn nói findđể liệt kê trẻ em đầu tiên.
muru

2

Tôi nghĩ vấn đề là không có cách nào hoàn hảo để xóa một thư mục rất lớn và toàn bộ tập hợp nội dung của nó với một hệ thống lưu trữ được lập chỉ mục thực sự hiểu về việc không liên kết và không có nghĩa là nó nghĩ rằng nó bị thiếu các tệp FSCK. Phải có một sự tin tưởng.

Chẳng hạn, tôi có zoneminder đang chạy cho một sân gôn. Tôi đã tạo ra một cuộc đột kích linux 1,5 TB để xử lý lượng dữ liệu khổng lồ mà cô ấy thu được mỗi ngày (12 nguồn cấp dữ liệu camera) cách cô ấy chạy trên ổ đĩa 120 GB vượt xa tôi. Câu chuyện dài thư mục cho tất cả các dữ liệu thu được là khoảng 1,4 TB dung lượng lưu trữ của cô. Rất nhiều để thanh trừng

Phải cài đặt lại ZM và xóa thư viện cũ 1,4 TB không có gì thú vị vì có thể mất 1 - 2 ngày để xóa các hình ảnh cũ.

Một FS được lập chỉ mục thực sự cho phép thả thư mục và biết rằng dữ liệu trong đó đã chết và việc xóa dữ liệu là một sự lãng phí thời gian và tài nguyên PC của chúng tôi. Nó sẽ là một tùy chọn để loại bỏ dữ liệu bị xóa. RM chỉ mất nhiều thời gian trong thế giới thực trên ext4.

Trả lời: Bỏ liên kết đệ quy tất cả các tệp sẽ nhanh hơn một chút nhưng bạn vẫn phải dành thời gian để chạy FSCK.

Tạo một tập lệnh chạy lệnh "FOR" đệ quy có thể "hủy liên kết" tất cả các tệp trong các thư mục của bạn, sau đó chỉ rm hoặc rmdir tất cả các thư mục để dọn sạch nó. Chạy thủ công FSCK để loại bỏ phần còn lại của dữ liệu khi thuận tiện. Kinda lười không viết nó xin lỗi :).


0

Mặc dù không hữu ích nếu bạn muốn xóa một thư mục hiện có, tôi sẽ đề cập rằng một chiến lược khả thi nếu bạn biết bạn sẽ có một thư mục chứa một tập tin mà bạn sẽ cần phải lọc thường xuyên là đặt thư mục đó vào hệ thống tệp của riêng nó ( ví dụ: phân vùng). Sau đó, khi bạn cần thanh lọc nó, ngắt kết nối nó, chạy một mkfsvà kể lại nó. Ví dụ, OpenBSD khuyên bạn nên làm điều này/usr/obj , trong đó nhiều tệp được tạo trong quá trình xây dựng hệ thống và phải bị xóa trước khi xây dựng tiếp theo.

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.