Bạn có thể muốn thử một cái gì đó như thế:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find được sử dụng để tìm các tập tin phù hợp với tiêu chí nhất định.
-mtime +7
chỉ chọn các tệp cũ hơn 7 ngày (bạn có thể sử dụng bất kỳ giá trị nào khác)
-exec fuser -s {} ';'
gọi fuser ở chế độ im lặng cho mọi tệp phù hợp với tiêu chí cũ. fuser trả về 0 (= true) cho mọi tệp được truy cập ngay bây giờ và 1 (= false) cho những tệp chưa được xử lý. Vì chúng tôi chỉ quan tâm đến những người chưa được xử lý, chúng tôi đã đặt -not
trước-exec
-exec echo {} ';'
chỉ in tất cả các tên tập tin phù hợp với tiêu chí. bạn có thể muốn sử dụng -exec rm {} ';'
thay vì ở đây, nhưng vì điều này có thể xóa một số tệp vẫn đang sử dụng, tôi nghĩ rằng an toàn hơn khi thực hiện một tiếng vang đơn giản trước tiên.
- chỉnh sửa: Bạn có thể muốn thêm một cái gì đó như
-name 'foo*.bar'
hoặc -uid 123
để hạn chế ảnh hưởng của việc dọn dẹp vào các mẫu tệp hoặc ID người dùng cụ thể để tránh các hiệu ứng ngẫu nhiên.
Đến điểm cuối cùng: Hãy xem xét rằng có thể có các tệp chỉ được ghi một lần (ví dụ: khi khởi động hệ thống) nhưng đọc thường xuyên (ví dụ: bất kỳ X-session-cookie nào). Do đó, tôi khuyên bạn nên thêm một số kiểm tra tên để chỉ ảnh hưởng đến các tệp được tạo bởi các chương trình bị lỗi của bạn.
chỉnh sửa2:
Cho câu hỏi cuối cùng của bạn: Một tệp sẽ không bị xóa khỏi đĩa cho đến khi không có quá trình nào xử lý mở đối với nó (ít nhất là đối với các hệ thống tệp linux gốc). Vấn đề là mục nhập thư mục bị xóa ngay lập tức, điều đó có nghĩa là từ khi bạn xóa tệp, không có quy trình mới nào có thể mở tệp được nữa (vì không có tên tệp nào được đính kèm).
Để biết chi tiết, hãy xem:
/programming/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux
edit3: Nhưng nếu tôi muốn tự động hóa toàn bộ quá trình thì sao?
Như tôi đã nói, có thể có các tệp được viết một lần và sau đó đọc từng lần một (ví dụ: cookie phiên X, tệp PID, v.v.). Những người sẽ không bị loại trừ bởi tập lệnh xóa nhỏ này (đó là lý do tại sao bạn có thể muốn chạy thử echo
trước tiên trước khi thực sự xóa các tệp).
Một cách để thực hiện một giải pháp an toàn là sử dụng atime
.
atime
lưu trữ thời gian mỗi tệp được truy cập lần cuối. Nhưng tùy chọn hệ thống tệp đó thường bị vô hiệu hóa vì nó có tác động khá lớn đến hiệu suất (theo blog này ở đâu đó trong khu vực 20-30%). Có relatime
, nhưng người ta chỉ ghi thời gian truy cập nếu mtime
đã thay đổi, vì vậy điều này sẽ không giúp chúng ta.
Nếu bạn muốn sử dụng atime
, tôi khuyên bạn nên có /tmp
một phân vùng riêng (lý tưởng nhất là ramdisk) để tác động hiệu suất trên toàn hệ thống không quá lớn.
Khi atime
được bật, tất cả những gì bạn phải làm là thay thế -mtime
tham số trong dòng lệnh trên bằng -atime
.
Bạn có thể loại bỏ -not -exec fuser -s {} ';'
, nhưng tôi sẽ giữ nó ở đó chỉ để đảm bảo (trong trường hợp các ứng dụng giữ các tệp mở trong một thời gian dài).
Nhưng hãy nhớ kiểm tra lệnh bằng cách sử dụng echo
trước khi bạn kết thúc việc xóa những thứ mà hệ thống của bạn vẫn cần!