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 -delete
Anda yakin menemukan file yang ingin Anda hapus.
Untuk menjalankannya dengan cron, saya mungkin hanya akan membuat skrip yang dapat dieksekusi (tambahkan shebang - #!bin/sh
ke baris teratas file dan membuatnya dapat dieksekusi dengan chmod a+x
), lalu meletakkannya di cron
direktori yang sesuai seperti /etc/cron.daily
atau /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, -delete
opsi untuk find
tidak 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-execdir
yang mengurangi kerentanan tersebut.
/a/b/c/[12]
, tetapi ini hanya benar-benar tepat jika subdirektori memiliki nama huruf tunggal. Di dalam bash
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 digunakan bash
(saya tidak merekomendasikan untuk mengubahnya jika tidak).
ksh
, bash
dan zsh
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
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.
tmpwatch
telah dipalsukan tmpreaper
, yang (setidaknya pada Debian) tampaknya merupakan penggantinya.
/a/b/c/
tidak harus ditentukan untuk setiap opsi?