Modo più pulito per eliminare i file su Linux che includono un datestamp come parte del nome del file


8

Ho un nuovo requisito per eliminare i file di dump MySQL più vecchi di 30 giorni. I file usano una convenzione di denominazione di "all-mysql-YYYYMMDD-HHMM.dump". I file si trovano sul file system montato su SAN, quindi il ripristino non è un problema, ma lo spazio sull'unità è purtroppo limitato e si riempie rapidamente quindi richiede un intervento umano frequente.

Esempio di nomi di file

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

Il mio primo pensiero è stato di usare "trova" all'interno di uno script batch con -mtime +30, tuttavia, i tempi di modifica non possono essere garantiti e alcuni degli archivi più vecchi potrebbero eludere la data di eliminazione :)

Ho creato il seguente script BASH, ma speravo che ci fosse un modo più pulito di eseguire questa operazione.

#!/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

3
Mi sembra perfettamente adeguato e non riesco a vedere un modo più semplice di fare la conversione della data rispetto al modo in cui hai effettivamente preso. :)
tink

@tink - Grazie. Non posso fare a meno di pensare che ci fosse una soluzione di copertina per questo. Ero più interessato agli altri manutentori che vivono più in JavaLand che a BASHland. Forse l'unica preoccupazione è il problema "Anno 2038" quindi :)
TP

2
Non è logrotateuna soluzione più pulita?
ott--

2
Per cose come queste dovrebbe esserci anche una protezione (non eliminare i vecchi backup quando per qualche motivo non ce ne sono di nuovi).
frostschutz,

@ott - Potrebbe essere un'opzione se funziona bene in userland. Sfortunatamente, a noi (ingegneri delle app) non è permesso alcun privilegio di root o di su, quindi se qualcuno sputa su syslog o richiede altri privilegi di superutente, saremo al buio. È un peccato ma è la politica in carica :(
TP

Risposte:


3

Un altro modo per eliminare tutti tranne gli ultimi 30 file:

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

Oppure ecco una versione più breve dello script nel post originale:

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

L'opzione 1 non prenderebbe in considerazione i backup provvisori che potrebbero comportare più di 30 file, ma l'opzione 2 era ciò che speravo di ottenere (uno script più conciso). Tuttavia, il refactor dello script pubblicato ha prodotto un errore, quindi ho modificato la riga di assegnazione della data in d = $ (data -d @ $ (($ (data +% s) -30 * 86400)) +% Y% m% d ) e ha funzionato in modo identico alla sceneggiatura del post originale.
TP

date -d non ha funzionato su OS X, ma -r sembra avere anche un significato diverso nella data gnu.
Lri

Sì. Un altro GNU vs BSD gotcha :)
TP

1

Se si desidera eliminare tutto tranne gli ultimi 30 file:

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

Ciò soddisferebbe le tue esigenze a condizione che ci sia un backup al giorno e che lo schema di denominazione rimanga così com'è (ovvero ordine alfabetico = ordine cronologico, nessuno spazio nei nomi dei file).

In uno dei tuoi commenti hai richiesto espressamente una riga. Personalmente mi piace scrivere di più. Questa fodera è un po 'pericolosa (se la sed fallisce, tutto viene cancellato).


Attualmente, potrebbero esserci più backup (dump) al giorno per aggiornare il QA e gli ambienti locali. Forse sillabarlo e giocare in sicurezza è l'approccio migliore.
TP

Potresti quindi caricarlo fino a 40 o 50 file (per quanto molti possano permettersi spazio di archiviazione). Se si disponesse di un file system separato per tali backup, è possibile persino stat lo spazio libero e rm solo il primo backup quando non è disponibile spazio sufficiente.
frostschutz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.