Exclui arquivos que não fazem parte de uma matriz bash

1

Agora eu faço backup dos bancos de dados mysql usando um cronjob todos os dias. Agora que o servidor está ficando cheio, eu só quero manter um backup para cada mês, um backup de domingo a cada semana e os últimos 7 backups.

Meus arquivos de backup são assim (em um diretório /var/backup ):

    full_2015-05-16-061115.sql.gz.enc
    full_2015-05-17-061117.sql.gz.enc
    ...

Esta postagem do serverfault: link me ajudou a criar o script de shell e como determinar os dias corretos e colocá-los em uma matriz.

Eu alterei o script acima postando um pouco e aqui está:

for i in {0..7}; 
do 
index=$(date +"%Y%m%d" -d "-$i day");
value=$(date +"%Y-%m-%d" -d "-$i day");
keep[index]=$value; 
done; 

for i in {0..4}; 
do 
index=$(date +"%Y%m%d" -d "sunday-$((i+1)) week");
value=$(date +"%Y-%m-%d" -d "sunday-$((i+1)) week");
keep[index]=$value; 
done

for i in {0..12}; 
do
        DW=$(($(date +%-W)-$(date -d $(date -d "$(date +%Y-%m-15) -$i month" +%Y-%m-01) +%-W)))
        for (( AY=$(date -d "$(date +%Y-%m-15) -$i month" +%Y); AY < $(date +%Y); AY++ )); do
                ((DW+=$(date -d $AY-12-31 +%W)))
        done
index=$(date +"%Y%m%d" -d "sunday-$DW weeks");
value=$(date +"%Y-%m-%d" -d "sunday-$DW weeks");
keep[index]=$value; 
done

echo ${keep[@]};

saída é:

2014-05-04 2014-06-01 2014-07-06 2014-08-03 2014-09-07 2014-10-05 2014-11-02 2014-12-07 2015-01-04 2015-02-01 2015-03-01 2015-04-05 2015-04-26 2015-05-03 2015-05-10 2015-05-17 2015-05-20 2015-05-21 2015-05-22 2015-05-23 2015-05-24 2015-05-25 2015-05-26 2015-05-27

Então, minha pergunta é, com base em ${keep[@]} , como manter os arquivos em que as datas estão em ${keep[@]} e excluir o restante?

Obrigado antecipadamente!

    
por Community 27.05.2015 / 09:22

2 respostas

2

É assim que eu faria isso:

find /var/backup/ -type f -maxdetph 1 $(printf "! -name %s " ${keep[*]}) \
  -exec rm {} \;

Observe que isso não funcionará se os nomes dos arquivos contiverem espaços.

    
por 27.05.2015 / 21:08
1

Que tal usar grep -vE com a seguinte expressão:

$ echo "$(IFS=\| && echo "${keep[*]}")"
2014-05-04|2014-06-01|2014-07-06|2014-08-03|2014-09-07|2014-10-05|2014-11-02|2014-12-07|2015-01-04|2015-02-01|2015-03-01|2015-04-05|2015-04-26|2015-05-03|2015-05-10|2015-05-17|2015-05-20|2015-05-21|2015-05-22|2015-05-23|2015-05-24|2015-05-25|2015-05-26|2015-05-27

Então você pode fazer assim:

ls /var/backup/* | grep -vE "$(IFS=\| && echo "${keep[*]}")" | xargs -r rm

Atualizado: se você preferir usar o find:

find /var/backup -maxdepth 1 -type f | grep -vE "$(IFS=\| && echo "${keep[*]}")" | xargs -r rm

Ou mais complicado:

find /var/backup -maxdepth 1 -type f -regextype posix-egrep ! -regex ".*($(IFS=\| && echo "${keep[*]}")).*" -print0 | xargs -0r rm
    
por 27.05.2015 / 12:54