GNU/Linux >> Belajar Linux >  >> Linux

Hapus File Log Lama Kecuali Yang Terakhir (Diurutkan Secara Alfanumerik)?

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

Linux
  1. Skrip Bash untuk menghapus semua file kecuali N saat diurutkan menurut abjad

  2. Bagaimana cara menghapus semua file dalam direktori kecuali beberapa?

  3. Hapus semua /var/log?

  1. 3 Cara Menghapus Semua File di Direktori Kecuali Satu atau Beberapa File dengan Ekstensi

  2. Sed:Hapus Semua Kemunculan String Kecuali Yang Pertama?

  3. Hapus Semua File Dalam Satu Folder Kecuali Yang Terakhir (Terbaru) 20?

  1. Perintah Untuk Membersihkan File Log Lama?

  2. Ganti Semua Baris Baru Ke Spasi Kecuali Yang Terakhir?

  3. Pindahkan semua file kecuali satu