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?
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?
Câu trả lời:
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
rm
sẽ 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 đó rm
phả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 rm
mộ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 -delete
trong đó sử dụng một unlink
cuộc gọi nội bộ đến kernel (giống như rm
vậ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, rm
là 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.
unlink
gọi hệ thống trên các thư mục (bạn sẽ gặp EISDIR
lỗi), vì vậy tùy chọn đầu tiên là không thể.
mv
ing giữa các hệ thống tập tin / phân vùng khác nhau có nghĩa là cp
theo sau bởi a rm
.
/tmp
trên cùng một hệ thống tập tin, tôi tự hỏi nếu mv
và 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 rm
nào.
rsync
trong chuẩn này trường hợp là nhanh hơn rm -rf
: web.archive.org/web/20130929001850/http://linuxnote.net/...
Đôi khi, find $DIR_TO_DELETE -type f -delete
nhanh 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
, mkfs
và lại mount
.
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 -print
hiển thị các tập tin khi chúng đang bị xóa.
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:
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ú:
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
find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf
. Các -depth
tùy chọn nói find
để liệt kê trẻ em đầu tiên.
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 :).
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 mkfs
và 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.