Cara bersih untuk menghapus file di Linux yang menyertakan datestamp sebagai bagian dari nama file

8

Saya memiliki persyaratan baru untuk membersihkan file dump MySQL yang lebih lama dari 30 hari. File-file menggunakan konvensi penamaan "all-mysql-YYYYMMDD-HHMM.dump". File-file tersebut terletak pada sistem file yang dipasang di SAN, jadi pemulihan tidak menjadi masalah, tetapi sayangnya ruang drive terbatas dan terisi dengan cepat sehingga membutuhkan intervensi manusia yang sering.

Contoh nama file

  • all-mysql-20130324-2330.dump
  • all-mysql-20130325-2330.dump
  • all-mysql-20130326-2330.dump

Pikiran pertama saya adalah menggunakan "find" di dalam skrip batch dengan -mtime +30, namun, waktu modifikasi tidak dapat dijamin dan beberapa arsip lama dapat menghindari tanggal pembersihan :)

Saya membuat skrip BASH berikut, tetapi saya berharap ada cara yang lebih bersih untuk melakukan operasi ini.

#!/bin/bash

STARTING_DIR=$(pwd)

FILE_PREFIX=all-mysql-
BACKUP_DIR=/opt/backup/mysql/dumps
ARCHIVE_WINDOW_DAYS=30

cd $BACKUP_DIR

# Create YYYYMMDD datestamp for Today - $ARCHIVE_WINDOW_DAYS
ARCHIVE_WINDOW_IN_SECS=$(echo "$(date +%s) - (${ARCHIVE_WINDOW_DAYS} * 86400)" | bc)
PURGE_BEFORE_DATE=$(date -d @${ARCHIVE_WINDOW_IN_SECS} +%Y%m%d)

for backup_file in $FILE_PREFIX*
do
    # Trim prefix, time portion of date stamp, and file extension
    # from $backup_file to allow numeric comparison against YYYYMMDD
    backup_trim_tmp=${backup_file#${FILE_PREFIX}}
    backup_trimmed=${backup_trim_tmp%-****.dump}

    if [ ${PURGE_BEFORE_DATE} -gt ${backup_trimmed} ]
    then
        rm $backup_file
    fi
done

cd $STARTING_DIR
TP
sumber
3
Terlihat sangat memadai bagi saya, dan saya tidak dapat melihat cara yang lebih sederhana untuk melakukan konversi tanggal daripada cara yang sebenarnya Anda lakukan. :)
tink
@tink - Terima kasih. Tidak dapat membantu untuk berpikir ada solusi satu kapal untuk ini. Saya lebih peduli dengan pengelola lain yang tinggal lebih banyak di JavaLand daripada BASHland. Mungkin satu-satunya masalah adalah masalah "Tahun 2038" :)
TP
2
Bukan logrotatesolusi yang lebih bersih?
ott--
2
Untuk hal-hal seperti ini harus ada perlindungan (jangan hapus backup lama ketika karena alasan tertentu tidak ada yang baru).
frostschutz
@ott - Itu bisa menjadi pilihan jika berfungsi baik di userland. Sayangnya, kami (insinyur aplikasi) tidak diizinkan melakukan root atau su privilege, jadi jika ada yang meludah ke syslog atau membutuhkan privuser superuser lainnya, kami akan berada dalam kegelapan. Ini menyebalkan tapi itu adalah kebijakan yang berlaku :(
TP

Jawaban:

3

Cara lain untuk menghapus semua kecuali 30 file terakhir:

rm $(ls -r | tail -n +31)

Atau di sini adalah versi yang lebih pendek dari skrip di pos asli:

cd /opt/backup/mysql/dumps
d=$(date -r $(($(date +%s)-30*86400)) +%Y%m%d)
for f in all-mysql-*; do
    [[ ${f#all-mysql-} < $d ]] && rm $f
done
Lri
sumber
Opsi 1 tidak akan memperhitungkan cadangan sementara akun yang dapat menyebabkan lebih dari 30 file, tetapi opsi 2 adalah apa yang saya harapkan untuk dicapai (skrip yang lebih ringkas). Namun, refactor skrip yang diposting memang menghasilkan kesalahan, jadi saya mengubah baris penetapan tanggal menjadi d = $ (date -d @ $ (($ (date +% s) -30 * 86400)) +% Y% m% d ) dan itu bekerja identik dengan skrip di pos asli.
TP
date -d tidak berfungsi pada OS X, tetapi -r juga tampaknya memiliki arti yang berbeda pada tanggal gnu.
Lri
Ya. Gotcha GNU vs BSD lain :)
TP
1

Jika Anda ingin menghapus semua kecuali 30 file terakhir:

rm `echo " " all-mysql-*.dump | sed -r -e 's/( [^ ]+){0,30}$//'`

Itu akan memenuhi persyaratan Anda asalkan ada satu cadangan per hari, dan skema penamaan tetap seperti itu (yaitu urutan alfabet = urutan kronologis, tidak ada spasi dalam nama file).

Anda secara khusus meminta satu kalimat di salah satu komentar Anda. Secara pribadi saya lebih suka menulis hal-hal. Liner satu ini sedikit di sisi berbahaya (jika sed gagal, semuanya dihapus).

frostschutz
sumber
Saat ini, mungkin ada beberapa cadangan (kesedihan) per hari untuk menyegarkan QA dan lingkungan lokal. Mungkin mengeja dan bermain aman adalah pendekatan terbaik.
TP
Anda dapat menyimpannya hingga 40 atau 50 file (berapa banyak ruang penyimpanan yang Anda miliki). Jika Anda memiliki sistem file terpisah untuk cadangan tersebut, Anda bahkan dapat mengatur ruang kosong dan hanya membuat cadangan pertama saat ruang yang tersedia tidak mencukupi.
frostschutz