Script de excluir backup mais de 20 dias da data atual [RESOLVIDO]

1. Script de excluir backup mais de 20 dias da data atual [RESOLVIDO]

Rubismar Camacho
rubis

(usa CentOS)

Enviado em 09/10/2015 - 09:13h

E ai pessoal, será que alguem consegue me ajudar. Na empresa onde trabalho tenho um processo que roda todos os dias bkp de meu banco de dados com nome bkp_kw_xxxx_ddmm.tar.bz2, e fiz agora um script para apagar os backups com mais de 20 dias da data corrente, o problema é que ele ta interpletando mal o meu if e apagando todo mundo e não só os bkps que tenhao mais de 20 dias, eu pego a data do nome do arquivo mesmo. segue script:

LOG="/var/log/logbkp_1001.txt"
DIR_BKP="/u03/1001"
DATA_ALVO="$(date -d '-20 days' '+%d%m')" # - 30 dias após a data atual
DIA_ATUAL=`date +%d-%m`
ARQUIVO="$(find /u03/1001/ -name '*.tar.bz2')"
NOME_ARQUIVO=${ARQUIVO##*/}
DATA_ARQUIVO=${NOME_ARQUIVO:12:4}

cd ${DIR_BKP}

echo "Inicio: `date +%d-%m-%y_%H:%M:%S`" >> ${LOG}

echo Relatorio de Limpeza de ${DIA_ATUAL} > ${LOG}
echo "-----------------------------------" >> ${LOG}
echo "${ARQUIVO}" >> ${LOG}
echo "-----------------------------------" >> ${LOG}


for ARQUIVO in $(find /u03/1001 -name '*.tar.bz2')
do
NOME_ARQUIVO=${ARQUIVO##*/}
DATA_ARQUIVO=${NOME_ARQUIVO:12:4} # pega a data do nome do arquivo, posicao 18(17) 4 digitos
# se a data_alvo for maior ou igual a data do arquivo
echo "Apagados os seguintes arquivos" >> ${LOG}
echo "-----------------------------------" >> ${LOG}
echo "$ARQUIVO " >> ${LOG}
echo "-----------------------------------" >> ${LOG}

if [ $DATA_ALVO -ge $DATA_ARQUIVO ]
then

rm -rvf $ARQUIVO

fi
done
echo "Fim: `date +%d-%m-%y_%H:%M:%S`" >> ${LOG}

se alguem puder me ajudar agradeço.



  


2. Re: Script de excluir backup mais de 20 dias da data atual

Guilherme Isaac
guilhermisaac

(usa Arch Linux)

Enviado em 09/10/2015 - 09:39h

Cara bem no começo quando tu faz a procura dos arquivos vc armezena a saida de todos os arquivos na variavel ARQUIVOS
E la na condição if tu deleta todos os arquivos que estão armazenados na variavel ARQUIVOS, a condição só trata o seguinte:
se a data alvo for menor ou igual a data do arquivo eu removo tudo que foi armazenado na variavel ARQUIVO, ou seja tudo que tenha a extensão .tar.bz2
vc poderia filtrar ela, dizendo pra ela armazenar apenas os arquivos a data -20 dias
ARQUIVO="$(find /u03/1001/ -name '*.tar.bz2' | grep `echo $DATA_ALVO`)"
ai vc armazena nessa variavel apenas os arquivos -20 dias
ai vc da uma enxugada no script e coloca no cron pra executar todos os dias e só alegria

--
Att

Guilherme Isaac


3. Re: Script de excluir backup mais de 20 dias da data atual [RESOLVIDO]

João Paulo de Vasconcelos Resende
jpvr2005

(usa Debian)

Enviado em 09/10/2015 - 10:08h

Bom dia amigo,
Nos meus scripts eu uso a seguinte linha para excluir arquivos antigos:
find /mnt/diretorio_backup/ -ctime +20 -exec rm -rf {} \;

Onde +20 é a quantidade de dias para manter os arquivos no diretório.

Att.
João Paulo


4. Re: Script de excluir backup mais de 20 dias da data atual [RESOLVIDO]

Rubismar Camacho
rubis

(usa CentOS)

Enviado em 09/10/2015 - 14:53h

guilhermisaac escreveu:

Cara bem no começo quando tu faz a procura dos arquivos vc armezena a saida de todos os arquivos na variavel ARQUIVOS
E la na condição if tu deleta todos os arquivos que estão armazenados na variavel ARQUIVOS, a condição só trata o seguinte:
se a data alvo for menor ou igual a data do arquivo eu removo tudo que foi armazenado na variavel ARQUIVO, ou seja tudo que tenha a extensão .tar.bz2
vc poderia filtrar ela, dizendo pra ela armazenar apenas os arquivos a data -20 dias
ARQUIVO="$(find /u03/1001/ -name '*.tar.bz2' | grep `echo $DATA_ALVO`)"
ai vc armazena nessa variavel apenas os arquivos -20 dias
ai vc da uma enxugada no script e coloca no cron pra executar todos os dias e só alegria

--
Att

Guilherme Isaac


E ai Guilherme, cara tentei fazer como você me disse. só para ti imaginar o cenário como fiz aqui para testar.
no meu diretorio onde fica os bkp criei os bkps com o padrao de nome que esta configurado, tenho os seguintes arquivos: bkp_kw_1001_2008.tar.bz2 bkp_kw_1001_2108.tar.bz2 bkp_kw_1001_2208.tar.bz2
bkp_kw_1001_2009.tar.bz2 bkp_kw_1001_2109.tar.bz2 bkp_kw_1001_2308.tar.bz2

fiz a alteração como me indicou e ficou assim o script:
ARQUIVO="$(find /u03/1001/ -name '*.tar.bz2'| grep `echo $DATA_ALVO`)"
NOME_ARQUIVO=${ARQUIVO##*/}
DATA_ARQUIVO=${NOME_ARQUIVO:12:4}

cd ${DIR_BKP}

echo "Inicio: `date +%d-%m-%y_%H:%M:%S`" >> ${LOG}

echo Relatorio de Limpeza de ${DIA_ATUAL} > ${LOG}
echo "-----------------------------------" >> ${LOG}
echo "${ARQUIVO}" >> ${LOG}
echo "-----------------------------------" >> ${LOG}


for ARQUIVO in $(find /u03/1001 -name '*.tar.bz2')
do
NOME_ARQUIVO=${ARQUIVO##*/}
DATA_ARQUIVO=${NOME_ARQUIVO:12:4} # pega a data do nome do arquivo, posicao 18(17) 4 digitos
# se a data_alvo for maior ou igual a data do arquivo
echo "Apagados os seguintes arquivos" >> ${LOG}
echo "-----------------------------------" >> ${LOG}
echo "$ARQUIVO " >> ${LOG}
echo "-----------------------------------" >> ${LOG}

if [ $DATA_ALVO -ge $DATA_ARQUIVO ]
then

rm -rf $ARQUIVO

fi
done
echo "Fim: `date +%d-%m-%y_%H:%M:%S`" >> ${LOG}

quando rodo ele em modo debug ele me mostra o seguinte:
+ echo 'Inicio: 09-10-15_14:34:19'
+ echo Relatorio de Limpeza de 09-10
+ echo -----------------------------------
+ echo ''
+ echo -----------------------------------
++ find /u03/1001 -name '*.tar.bz2'
+ for ARQUIVO in '$(find /u03/1001 -name '\''*.tar.bz2'\'')'
+ NOME_ARQUIVO=bkp_kw_1001_2009.tar.bz2
+ DATA_ARQUIVO=2009
+ echo 'Apagados os seguintes arquivos'
+ echo -----------------------------------
+ echo '/u03/1001/bkp_kw_1001_2009.tar.bz2 '
+ echo -----------------------------------
+ '[' 1909 -ge 2009 ']'
+ for ARQUIVO in '$(find /u03/1001 -name '\''*.tar.bz2'\'')'
+ NOME_ARQUIVO=bkp_kw_1001_2108.tar.bz2
+ DATA_ARQUIVO=2108
+ echo 'Apagados os seguintes arquivos'
+ echo -----------------------------------
+ echo '/u03/1001/bkp_kw_1001_2108.tar.bz2 '
+ echo -----------------------------------
+ '[' 1909 -ge 2108 ']'
+ for ARQUIVO in '$(find /u03/1001 -name '\''*.tar.bz2'\'')'
+ NOME_ARQUIVO=bkp_kw_1001_2109.tar.bz2
+ DATA_ARQUIVO=2109
+ echo 'Apagados os seguintes arquivos'
+ echo -----------------------------------
+ echo '/u03/1001/bkp_kw_1001_2109.tar.bz2 '
+ echo -----------------------------------
+ '[' 1909 -ge 2109 ']'
+ for ARQUIVO in '$(find /u03/1001 -name '\''*.tar.bz2'\'')'
+ NOME_ARQUIVO=bkp_kw_1001_2008.tar.bz2
+ DATA_ARQUIVO=2008
+ echo 'Apagados os seguintes arquivos'
+ echo -----------------------------------
+ echo '/u03/1001/bkp_kw_1001_2008.tar.bz2 '
+ echo -----------------------------------
+ '[' 1909 -ge 2008 ']'
+ for ARQUIVO in '$(find /u03/1001 -name '\''*.tar.bz2'\'')'
+ NOME_ARQUIVO=bkp_kw_1001_2308.tar.bz2
+ DATA_ARQUIVO=2308
+ echo 'Apagados os seguintes arquivos'
+ echo -----------------------------------
+ echo '/u03/1001/bkp_kw_1001_2308.tar.bz2 '
+ echo -----------------------------------
+ '[' 1909 -ge 2308 ']'
+ for ARQUIVO in '$(find /u03/1001 -name '\''*.tar.bz2'\'')'
+ NOME_ARQUIVO=bkp_kw_1001_2208.tar.bz2
+ DATA_ARQUIVO=2208
+ echo 'Apagados os seguintes arquivos'
+ echo -----------------------------------
+ echo '/u03/1001/bkp_kw_1001_2208.tar.bz2 '
+ echo -----------------------------------
+ '[' 1909 -ge 2208 ']'
++ date +%d-%m-%y_%H:%M:%S
+ echo 'Fim: 09-10-15_14:34:19'

e no log ele ta colocando todos os arquivos sitados acima como excluidos, sende que tem arquivos que nao tem 20 dias, porem na verdade ele nem exclui os arquivos desta vez. agora ele nao exclui nada. hehe






5. Re: Script de excluir backup mais de 20 dias da data atual [RESOLVIDO]

Rubismar Camacho
rubis

(usa CentOS)

Enviado em 09/10/2015 - 14:55h

jpvr2005 escreveu:

Bom dia amigo,
Nos meus scripts eu uso a seguinte linha para excluir arquivos antigos:
find /mnt/diretorio_backup/ -ctime +20 -exec rm -rf {} \;

Onde +20 é a quantidade de dias para manter os arquivos no diretório.

Att.
João Paulo


E ai João, o problema de fazer deste modo é que se o arquivo for editado ele vai trocar a data do arquivo, precisava que ele pegac a data do nome do arquivo como estou tentando fazer. Mas mesmo assim agradeço pela ajuda.






6. Re: Script de excluir backup mais de 20 dias da data atual

Guilherme Isaac
guilhermisaac

(usa Arch Linux)

Enviado em 09/10/2015 - 15:39h

vc esta com um problema no nome dos arquivos
Veja só

vc tem uma data

1909 - dezenove de setembro
e
0110 - primeiro de outubro

aparentemente sabemos que outubro é pra ser maior que setembro, só que a condição if não ve dessa forma ve que 0110 é menor que 1909 e provavelmente vc vai ter algum problema na exclusão dos arquivos
vc tem duas saidas:

Caso não queira alterar o nome dos arquivos vc tera que achar uma forma de armazenar o dia e o mes e depois trocar os valores por mes e dia.
Ou trocar o nome no backup do arquivo, não sei como é que ocorre ai pra vc, mas eu fiz a segunda opção e ficou assim o resumo do scrip sem os logs:

#!/bin/bash

DATA_ALVO="$(date -d '-20 days' '+%m%d')" # coloquei o mes primeiro que o dia, mas antes os arquivos tem que obedecer esse padão

for ARQUIVO in `find /dracula/mariokart/samurai/teste/ -name '*.tar.bz2' | cut -d/ -f6` # no meu cut deu f6 o sexto campo,
#como sendo o campo do arquivo, veja qual se enquadra no seu
do
DATA_ARQUIVO=${ARQUIVO:12:4}

if [ $DATA_ALVO -ge $DATA_ARQUIVO ]; then

rm $ARQUIVO

fi
done

--
Att

Guilherme Isaac


7. Re: Script de excluir backup mais de 20 dias da data atual [RESOLVIDO]

Rubismar Camacho
rubis

(usa CentOS)

Enviado em 09/10/2015 - 18:48h

guilhermisaac escreveu:

vc esta com um problema no nome dos arquivos
Veja só

vc tem uma data

1909 - dezenove de setembro
e
0110 - primeiro de outubro

aparentemente sabemos que outubro é pra ser maior que setembro, só que a condição if não ve dessa forma ve que 0110 é menor que 1909 e provavelmente vc vai ter algum problema na exclusão dos arquivos
vc tem duas saidas:

Caso não queira alterar o nome dos arquivos vc tera que achar uma forma de armazenar o dia e o mes e depois trocar os valores por mes e dia.
Ou trocar o nome no backup do arquivo, não sei como é que ocorre ai pra vc, mas eu fiz a segunda opção e ficou assim o resumo do scrip sem os logs:

#!/bin/bash

DATA_ALVO="$(date -d '-20 days' '+%m%d')" # coloquei o mes primeiro que o dia, mas antes os arquivos tem que obedecer esse padão

for ARQUIVO in `find /dracula/mariokart/samurai/teste/ -name '*.tar.bz2' | cut -d/ -f6` # no meu cut deu f6 o sexto campo,
#como sendo o campo do arquivo, veja qual se enquadra no seu
do
DATA_ARQUIVO=${ARQUIVO:12:4}

if [ $DATA_ALVO -ge $DATA_ARQUIVO ]; then

rm $ARQUIVO

fi
done

--
Att

Guilherme Isaac



Show Guilherme Agora deu certo. Muito obrigado pela ajuda







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts