Tugas Cron untuk menghapus file yang lebih lama dari 3 hari

21

Saya perlu menghapus file yang lebih lama dari 3 hari dengan pekerjaan cron di 3 direktori berbeda. (3 direktori ini adalah anak-anak dari direktori induk /a/b/c/1& /a/b/c/2& /a/b/c/3) Apakah ini dapat dilakukan dengan satu baris di crontab?

KingKongFrog
sumber

Jawaban:

26

Ini cukup mudah (walaupun perhatikan bahwa ini adalah waktu modifikasi lebih dari 3 hari yang lalu karena waktu pembuatan hanya tersedia pada sistem file tertentu dengan alat khusus):

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-delete

Hapus #sebelum -deleteAnda yakin menemukan file yang ingin Anda hapus.

Untuk menjalankannya dengan cron, saya mungkin hanya akan membuat skrip yang dapat dieksekusi (tambahkan shebang - #!bin/shke baris teratas file dan membuatnya dapat dieksekusi dengan chmod a+x), lalu meletakkannya di crondirektori yang sesuai seperti /etc/cron.dailyatau /etc/cron.weekly. Asalkan tentu saja Anda tidak perlu jadwal yang lebih spesifik dan bahwa direktori ini ada di distro Anda.

Memperbarui

Seperti disebutkan di bawah, -deleteopsi untuk findtidak terlalu portabel. Pendekatan yang kompatibel dengan POSIX adalah:

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-exec rm {} +

Sekali lagi hapus #ketika Anda yakin memiliki file yang tepat.

Pembaruan2

Mengutip komentar Stéphane Chazelas di bawah ini:

Perhatikan bahwa -exec rm {} +memiliki kerentanan kondisi ras yang -delete(jika tersedia) tidak memiliki. Jadi jangan menggunakannya pada direktori yang bisa ditulisi oleh orang lain. Beberapa temuan juga memiliki -execdiryang mengurangi kerentanan tersebut.

Graeme
sumber
Terima kasih! Apakah ada cara untuk menentukan direktori induk dan direktori anak sehingga /a/b/c/tidak harus ditentukan untuk setiap opsi?
KingKongFrog
Tentu, dalam shell POSIX yang dapat Anda lakukan /a/b/c/[12], tetapi ini hanya benar-benar tepat jika subdirektori memiliki nama huruf tunggal. Di dalam bashkamu bisa lakukan /a/b/c/{1,2}. Tentu saja maka baris bang untuk skrip harus #!/bin/bashatau jika Anda menggunakan crontab, Anda harus memastikan itu dikonfigurasi untuk digunakan bash(saya tidak merekomendasikan untuk mengubahnya jika tidak).
Graeme
2
brace expansion adalah fitur csh dan juga didukung oleh ksh, bash, zsh dan fish sehingga Anda memiliki berbagai pilihan cangkang. ksh, bashdan zshjuga memiliki operator bergantian di dunia mereka. Perhatikan bahwa -exec rm {} +memiliki kerentanan kondisi ras yang -delete(jika tersedia) tidak memiliki. Jadi jangan menggunakannya pada direktori yang bisa ditulisi oleh orang lain. Beberapa temuan juga memiliki -execdiryang mengurangi kerentanan tersebut.
Stéphane Chazelas
Tidak rm -fmenangani kesalahan secara diam-diam, sehingga menangani kemungkinan kondisi balapan dengan -exec?
Acumenus
9

Anda akan jauh lebih baik menggunakan tmpwatch

tmpwatch recursively removes files which haven't been accessed for a given time. Normally, it's used to clean up directories which are used for temporary holding space such as /tmp.
Barry Chapman
sumber
2
tmpwatchtelah dipalsukan tmpreaper, yang (setidaknya pada Debian) tampaknya merupakan penggantinya.
Jaap