Saya memiliki sejumlah file log dalam bentuk:
log.2014-02-19-10_24_22
Yaitu. log.YYYY-MM-DD-H24_MI_SS
Tanggal yang merupakan bagian dari nama file log adalah saat file log pertama kali dibuat. Jadi setiap saat saya dapat memiliki file log berikut di direktori saya:
log.2014-02-19-10_18_54
log.2014-02-19-10_21_20
log.2014-02-19-10_23_11
etc.
Sekarang saya memiliki skrip yang dipanggil oleh cronjob dan menghapus file log "lama":
$ cat delete-old-rotated-logs
#!/usr/bin/env bash
find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 -exec rm {} ;
Masalah yang saya hadapi adalah kadang-kadang proses yang logging macet sehingga file log "terbaru" juga menjadi "lama" setelah beberapa waktu (karena tidak ada proses yang menulis di atasnya) dan dihapus, sehingga saya kehilangan jejak. Bagaimana saya bisa menulis ulang delete-old-rotated-logs
skrip sehingga menghapus file lama kecuali yang terakhir (atau N
terakhir) ) ? Untuk pemesanan dapat menggunakan nama file itu sendiri atau stempel waktu modifikasi (lebih kuat).
Jawaban yang Diterima:
find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 |
sort | head -n -1 | xargs rm
Atau jika Anda ingin menggunakan mtime
alih-alih nama file:
find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 -exec ls -t {} + |
tail -n +2 | xargs rm
Dari komentar @Stephane, pendekatan yang lebih kuat adalah dengan melakukan:
IFS=$'n'
set -f
rm $(
find /home/foo -maxdepth 1 -iname log* ! -name $'*n*' -type f -mmin +1800 |
sort | head -n -1 )
Atau untuk POSIX shell (masih membutuhkan alat GNU):
IFS='
'
ex_newline='*
*'
set -f
rm $(
find /home/foo -maxdepth 1 -iname log* ! -name "$ex_newline" -type f -mmin +1800 |
sort | head -n -1 )
Pipa tunggal (kuat) dapat digunakan dengan versi terbaru dari GNU sed
/sort
(dan GNU menemukan seperti semua hal di atas):
find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 -print0 |
sort -z | sed -z '$d' | xargs -0 rm