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?
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.
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.
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?
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.
/a/b/c/
tidak harus ditentukan untuk setiap opsi?/a/b/c/[12]
, tetapi ini hanya benar-benar tepat jika subdirektori memiliki nama huruf tunggal. Di dalambash
kamu bisa lakukan/a/b/c/{1,2}
. Tentu saja maka baris bang untuk skrip harus#!/bin/bash
atau jika Anda menggunakan crontab, Anda harus memastikan itu dikonfigurasi untuk digunakanbash
(saya tidak merekomendasikan untuk mengubahnya jika tidak).ksh
,bash
danzsh
juga 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-execdir
yang mengurangi kerentanan tersebut.rm -f
menangani kesalahan secara diam-diam, sehingga menangani kemungkinan kondisi balapan dengan-exec
?Anda akan jauh lebih baik menggunakan
tmpwatch
sumber
tmpwatch
telah dipalsukantmpreaper
, yang (setidaknya pada Debian) tampaknya merupakan penggantinya.