Maneira mais limpa de excluir arquivos no Linux que incluem um datestamp como parte do nome do arquivo

8

Eu tenho um novo requisito para limpar arquivos de despejo do MySQL com mais de 30 dias. Os arquivos usam uma convenção de nomenclatura de "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, de modo que requer 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 escapar da data de eliminação:)

Eu criei o seguinte script BASH, mas esperava que houvesse uma maneira mais limpa de realizar 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
    
por T.P. 27.03.2013 / 20:20

2 respostas

3

Outra maneira de excluir todos, exceto os últimos 30 arquivos:

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

Ou aqui está uma versão mais curta do script na postagem original:

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
    
por 28.03.2013 / 17:47
1

Se você quiser excluir todos, exceto os 30 últimos arquivos:

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

Isso atenderia ao seu requisito, desde que haja um backup por dia, e o esquema de nomenclatura permaneça como está (ou seja, ordem alfabética = ordem cronológica, sem espaços nos nomes dos arquivos).

Você solicitou especificamente uma linha única em um de seus comentários. Pessoalmente, gosto de escrever mais coisas. Este forro é um pouco perigoso (se o sed falhar, tudo é deletado).

    
por 27.03.2013 / 21:40