Tenho um novo requisito para limpar os arquivos de despejo do MySQL com mais de 30 dias. Os arquivos usam uma convenção de nomenclatura "all-mysql-YYYYMMDD-HHMM.dump". Os arquivos estão localizados no sistema de arquivos montado na SAN, portanto, a restauração não é um problema, mas o espaço da unidade é limitado, infelizmente, e é preenchido rapidamente, exigindo intervenção humana frequente.
Exemplo de nomes de arquivos
- all-mysql-20130324-2330.dump
- all-mysql-20130325-2330.dump
- all-mysql-20130326-2330.dump
Meu primeiro pensamento foi usar "find" dentro de um script em lote com -mtime +30; no entanto, os tempos de modificação não podem ser garantidos e alguns dos arquivos mais antigos podem evitar a data de eliminação :)
Criei o seguinte script BASH, mas esperava que houvesse uma maneira mais limpa de executar essa operação.
#!/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
logrotate
uma solução mais limpa?Respostas:
Outra maneira de excluir todos, exceto os últimos 30 arquivos:
Ou aqui está uma versão mais curta do script na postagem original:
fonte
Se você deseja excluir todos, exceto os últimos 30 arquivos:
Isso atenderia aos seus requisitos, desde que haja um backup por dia, e o esquema de nomenclatura permaneça como está (por exemplo, ordem alfabética = ordem cronológica, sem espaços nos nomes dos arquivos).
Você solicitou especificamente uma linha em um de seus comentários. Pessoalmente, gosto de escrever mais. Este liner está um pouco perigoso (se o sed falhar, tudo será excluído).
fonte