Anda mungkin ingin mencoba sesuatu seperti itu:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find digunakan untuk menemukan file yang sesuai dengan kriteria tertentu.
-mtime +7
hanya memilih file yang lebih lama dari 7 hari (Anda dapat menggunakan nilai lain)
-exec fuser -s {} ';'
memanggil fuser dalam mode senyap untuk setiap file yang cocok dengan kriteria ketuaan. fuser mengembalikan 0 (= true) untuk setiap file yang telah diakses saat ini dan 1 (= false) untuk yang belum diakses. Karena kami hanya tertarik pada yang belum diakses, kami menempatkan -not
di depan ini-exec
-exec echo {} ';'
cukup cetak semua nama file yang cocok dengan kriteria. Anda mungkin ingin menggunakannya di -exec rm {} ';'
sini, tetapi karena ini dapat menghapus beberapa file yang masih digunakan, saya pikir lebih aman untuk melakukan gema sederhana terlebih dahulu.
- sunting: Anda mungkin ingin menambahkan sesuatu seperti
-name 'foo*.bar'
atau -uid 123
membatasi efek pembersihan ke pola file atau ID pengguna tertentu untuk menghindari efek yang tidak disengaja.
Ke poin terakhir: Pertimbangkan bahwa mungkin ada file yang hanya ditulis sekali (misalnya pada boot sistem) tetapi sering membaca (misalnya cookie X-sesi apa pun). Karena itu saya sarankan menambahkan beberapa pemeriksaan nama hanya mempengaruhi file yang dibuat oleh program Anda yang salah.
sunting2:
Untuk pertanyaan terakhir Anda: File tidak akan dihapus dari disk sampai tidak ada proses yang memiliki pegangan terbuka (setidaknya untuk sistem file linux asli). Masalahnya adalah bahwa entri direktori dihapus segera yang berarti bahwa sejak Anda menghapus file tidak ada proses baru dapat membuka file lagi (karena tidak ada nama file yang melekat padanya).
Untuk detail, lihat:
/programming/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux
sunting3: Tetapi bagaimana jika saya ingin mengotomatiskan seluruh proses?
Seperti yang saya katakan, mungkin ada file yang ditulis sekali dan kemudian dibaca sesekali (misalnya cookie sesi X, file PID, dll.). Itu tidak akan dikecualikan oleh skrip penghapusan kecil ini (yang merupakan alasan mengapa Anda mungkin ingin melakukan uji coba echo
terlebih dahulu sebelum benar-benar menghapus file).
Salah satu cara untuk mengimplementasikan solusi yang aman adalah menggunakan atime
.
atime
menyimpan waktu setiap file diakses terakhir kali. Tapi opsi sistem file itu sering dinonaktifkan karena memiliki dampak kinerja yang cukup (menurut blog ini di wilayah 20-30%). Ada relatime
, tetapi yang satu itu hanya menulis waktu akses jika mtime
sudah berubah, jadi yang ini tidak akan membantu kita.
Jika Anda ingin menggunakan atime
, saya sarankan untuk memiliki /tmp
partisi yang terpisah (idealnya ramdisk) sehingga dampak kinerja pada keseluruhan sistem tidak terlalu besar.
Setelah atime
diaktifkan, yang harus Anda lakukan adalah mengganti -mtime
parameter pada baris perintah di atas dengan -atime
.
Anda mungkin dapat menghapusnya -not -exec fuser -s {} ';'
, tetapi saya akan menyimpannya di sana hanya untuk memastikan (jika aplikasi membuka file untuk jangka waktu yang lama).
Tetapi perlu diingat untuk menguji perintah menggunakan echo
sebelum Anda akhirnya menghapus hal-hal yang masih dibutuhkan sistem Anda!