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?
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?
Jawaban:
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.
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.
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.
/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).
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.
rm -fmenangani kesalahan secara diam-diam, sehingga menangani kemungkinan kondisi balapan dengan -exec?
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.
tmpwatchtelah dipalsukan tmpreaper, yang (setidaknya pada Debian) tampaknya merupakan penggantinya.
/a/b/c/tidak harus ditentukan untuk setiap opsi?