Xóa các tập tin cũ hơn 30 ngày


8

Tôi có một thư mục bộ đệm với tối thiểu 15000 tệp.

Tôi đã thử điều này:

find cache* -mtime +30 -exec rm {} \;

Nhưng điều này làm cho tải máy chủ của tôi bay lên bầu trời!

Có giải pháp nào nhanh hơn / tốt hơn không?

Hoặc tôi có thể giới hạn tốc độ hoặc lặp lại của lệnh này?


1
Nếu cache*mở rộng ra nhiều tệp, bạn có thể muốn thử một cái gì đó như find . -name 'cache*' -mtime +30 -exec rm {} \;thay thế.
Jaap Eldering

Câu trả lời:


10

Tôi thích sử dụng tmpwatchcho những thứ này, đây là lần cuối cùng tập tin được sửa đổi. Nó đơn giản và hoạt động tốt trong nhiều trường hợp:

tmpwatch -m 720 /path/to/cache

Đối với Ubuntu, hãy kiểm tra tmpreaperthay thế.

Nếu bạn muốn kiểm tra lần cuối cùng tệp được truy cập hơn bạn sử dụng như sau:

tmpwatch -a 720 /path/to/cache

Bạn không thể sử dụng tmpwatch -a trên các hệ thống tệp được gắn với noatime. bạn vẫn có thể sử dụng -m


Tôi đang sử dụng Ubuntu 10.04.2 LTSvà lệnh đó không tồn tại ..
Kristian

2
@Kristian Kiểm tra tmpreaperthay thế.
slhck

Bất kỳ cạm bẫy khi sử dụng chúng để quản lý các hệ thống tập tin được gắn với tùy chọn noatime?
AnonymousLurker

@AnonymousLurker Tôi đã sửa đổi câu trả lời cho bạn
WojonsTech

6

Bạn có thể tránh việc sinh ra một quy trình mới cho mỗi tệp bằng cách sử dụng

find cache* -mtime +30 -delete

3

Hãy thử chạy ở trên với tốt đẹp:

nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'

Theo cách đó, tải trọng lớn sẽ chỉ xuất hiện nếu không có gì khác cần chạy, nếu không các quy trình khác sẽ được ưu tiên (nếu độ đẹp của chúng thấp hơn 19 tức là tối đa).

Lưu ý rằng đối số cho tùy chọn -n được thêm vào độ đẹp mặc định thay đổi trong khoảng từ -20 đến 19. Tôi đã sử dụng 39 để nó sẽ rất đẹp bất kể tính độc đáo ban đầu là gì.


2

Theo nhận xét của chiborg, tải là do bắt đầu rm cho mỗi tệp được tìm thấy. Tôi nhận thấy câu trả lời tmpwatchđược đề xuất thay thế, mà tôi chắc chắn hoạt động tốt. Tuy nhiên, nó không cần thiết.

Find có thể chạy lệnh được đưa ra để thực thi một lần, nếu bạn bảo nó tích lũy các tệp tìm thấy vào một danh sách các đối số như vậy:

find /path -name "*.moo" -exec rm {} \+

Điều này đôi khi có thể không hoạt động vì danh sách đối số có thể phát triển lớn hơn (tính bằng byte) so với mức tối đa được cho phép bởi trình bao (getconf ARG_MAX). Điều này có thể được giải quyết bằng xargs với tùy chọn -L.

xem xét ví dụ này:

$ echo 0 > /tmp/it; 
$ for i in {0..15000};do echo $i;done  |\
    xargs --no-run-if-empty -L 5000 ./tmp/xr.sh 
Iteration=0; running with 5000 arguments
Iteration=1; running with 5000 arguments
Iteration=2; running with 5000 arguments
Iteration=3; running with 1 arguments

$ cat tmp/xr.sh 
#!/bin/sh
IT=`cat /tmp/it`
echo Iteration=$IT\; running with $# arguments
let IT=IT+1
echo $IT > /tmp/it

Vì vậy, không cần cài đặt thêm phần mềm, tất cả những gì bạn cần là trong gnu-findutils:

find /path -mtime +30 -print0 | xargs -0 -L 5000 rm 

Một số d00d nghĩ rằng sẽ hữu ích khi thêm -print0 và -0 để tìm và xargs. Các đối số đó buộc các lệnh của chúng sử dụng null char (\ 0) thay vì dòng mới (\ n) để phân tách các đối số. Điều này hữu ích khi tên tệp có khoảng trắng hoặc dòng mới trong đó.
Ярослав Рахматуллин

(1) Bạn không cần phải nói \+; đồng bằng +là đủ tốt. (2) Điều này sẽ không thành công vì danh sách đối số có thể tăng lớn.  find  … -exec … {} +sẽ làm điều tương tự xargssẽ làm; nó sẽ chạy lệnh nhiều lần như nó cần. Ví dụ (như trong ví dụ của bạn), nếu bạn có từ 15001 đến 20000 tệp, findsẽ chạy -execchương trình 'd ( rm) bốn lần.
G-Man nói 'Phục hồi Monica'
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.