Criei um script para executar backups automatizados no meu servidor CentOS 7. Os backups são armazenados no diretório /home/backup. O script funciona, mas agora gostaria de incorporar uma forma de contar os arquivos após o backup acontecer e se o número for maior que 5, excluir o backup mais antigo.
Abaixo está o que eu tenho para o meu script de backup.
#!/bin/bash
#mysqldump variables
FILE=/home/backup/databasebk_!`date +"Y-%m-%d_%H:%M"`.sql
DATABASE=database
USER=root
PASS=my password
#backup command process
mysqldump --opt --user=${USER} --password=${PASS} ${DATABASE} > ${FILE}
#zipping the backup file
gzip $FILE
#send message to the user with the results
echo "${FILE}.gz was created:"
ls -l ${FILE}.gz
# This is where I would like to count the number of files
# in the directory and if there are more than 5 I would like
# to delete the oldest file. Any help is greatly appreciated
Obrigado -Mike
Em Bash puro sem loops:
Explicação:
ls -t
imprime todos os arquivos no diretório atual, ordenados por hora de modificação, os mais novos primeiro.tail -n +6
ignora as primeiras 5 linhas e imprime as linhas 6 em diante.xargs -d '\n' rm
remove os arquivos passados para ele, um por linha. Se você tem certeza absoluta de que não há espaços ou aspas nos nomes dos arquivos, você pode usar apenasxargs rm
.Observe que isso exclui quantos arquivos forem necessários para deixar apenas 5 arquivos no diretório. Se você deseja excluir apenas o arquivo mais antigo, substitua
+6
por1
.Você pode olhar
set -- /home/backup/databasebk_*
e enquanto$#
for maior que cinco, excluir um arquivo.Assim, o código seria semelhante a
Isso funciona porque os nomes de arquivos que você escolheu estão automaticamente na ordem "mais antigos primeiro".
Para consistência, eu definiria uma variável (eu normalmente a chamo,
BASE
mas você pode chamá-la como quiser)Então
Acho que uma abordagem melhor seria usar o logrotate, pois esse aplicativo já executa as ações que você está tentando realizar com seu script. Eu testei os seguintes scripts no meu servidor de teste.
Exemplo de erro se o primeiro banco de dados não foi criado.
você verá que um novo arquivo será criado seguido por um número, isso pode ser alterado para mostrar as datas usando as seguintes opções
Usando o
zsh
escudo:Isso criaria uma lista de nomes de caminho de arquivos regulares correspondentes
/home/backup/databasebk_*.sql.gz
, classificaria a lista nos carimbos de data e hora de modificação dos arquivos (modificados mais recentemente primeiro) e extrairia os elementos 6 até o final. Esses arquivos seriam então passadosrm -f
para exclusão.É o qualificador de glob ,
(.om[6,-1])
, no final do padrão de globbing de nome de arquivo que especifica arquivos regulares (.
), ordenando por hora de modificação (om
), e que a 6ª até a última correspondência deve ser retornada ([6,-1]
).Alguns comentários:
Eu digo
/home/backup/*
que encontra todos os arquivos nesse diretório, eu poderia dizer/home/backup/databasebk_*.sql.gz
apenas para encontrar despejos compactadosEstou usando 'stat' para encontrar o arquivo mais antigo de acordo com o sistema de arquivos, pois suas datas estão na ordem do formato YMDhm, eu poderia comparar os nomes dos arquivos
a presença de subdiretórios em /home/backup/ quebrará este script
Antes de começar, gostaria de dizer que tenho em alta estima as outras respostas e elas refletem uma boa compreensão do processo.
Agora vou me colocar no seu lugar e procurar algo simples para começar, então construir sobre isso. Deixe-me primeiro reafirmar seu problema:
Aqui está minha abordagem:
ls -1 |wc -l
para contar o número de arquivos.Aqui está o código:
Explicação da primeira linha: Verifica se o número de arquivos nesse diretório ultrapassa 5.
Explicação da segunda linha: Será executado apenas o número de arquivos superior a 5 (se houver 4 arquivos e deles um tiver uma data de 100 dias atrás, não será executado). Ele os classificará por data e executará o
tail
comando para obter o mais antigo (o último da lista). Em seguida, ele passará esse nome de arquivo para oxargs
comando que usarárm -f
(forçar) para excluir o arquivo.Obrigado a todos os outros que contribuíram com uma solução! Eu sei que há casos em que isso não funcionará (como mais de 6 arquivos, 2 arquivos da mesma data, etc), mas tentei mantê-lo simples, pois Mike é novo :)
Criar
rm-except-last.sh
:Então:
$ rm-except-last.sh 5 /home/backup/databasebk_*.sql