'localizar' comando não disponível no host, como implementar uma exclusão com base na hora da modificação usando outros comandos?

3

Estou criando uma solução simples de backup de base de dados para um cliente que usa hospedagem na Web no DataFlame.

A conta de hospedagem fornece acesso ao cron, mas não ao shell.

Eu tenho um script de backup de banco de dados criando backups regulares e quero remover automaticamente os que têm mais de N dias.

Eu tentei usar

find -v $backup_dir -mtime +$keep_days -name "*db.tar.gz" -delete

no entanto, o usuário que está executando o script não tem permissão para executar find .

Você pode sugerir como implementar isso sem usar o comando find ?

    
por CalumJEadie 28.03.2012 / 00:58

4 respostas

1

Uma idéia hack-ish pode ser incorporar os dias desde a época (ou seja, date +%s dividido por 86400) mod pelo seu $ keep_days no nome do arquivo.

Nesse caso, você não precisará remover arquivos de backup mais antigos. Você apenas sobrescreve os antigos, uma vez que o número $ keepHday dos dias após a data surge novamente.

Algo parecido com isto:

#!/bin/bash

keepdays=60
epochdays=$(expr $(date +%s) / 86400)

backupindx=$(expr $epochdays % $keepdays)

backupfile=/path/to/backup/file.${backupindx}.db.tgz

Então, hoje, 27 de março de 2012, você terá o arquivo de backup.7.db.tgz, que será substituído em 60 dias.

    
por 28.03.2012 / 02:09
1

Aqui está uma versão abreviada do script que usei no final, com base na resposta do @cjc.

#!/bin/sh

# Script to backup ... database.
#
# A rolling backup is used. The size of period backed up is configurable.
# The period size is expressed in terms of an arbitary time unit "timeunit".
#
# Files are saved with format:
# <date>-...-<index within period>.sql.tar.gz
#
# Author: Calum J. Eadie

### Configuration

backup_dir=/home/..../backups
# The size of a timeunit. Eg. 300 for a timeunit that is 5 minutes long.
seconds_per_timeunit=$(expr 60 \* 60 \* 6) # 6 hours
# The size of backup period in timeunits.
keep_timeunits=$(expr 4 \* 30) # 30 days

### Script

# Form files names

date_string='date +%Y-%m-%d-%H-%M-%S'
# Time since unix epoch in timeunits
epoch_timeunits=$(expr $(date +%s) / $seconds_per_timeunit)
# Index unique to timeperiod.
backup_index=$(expr $epoch_timeunits % $keep_timeunits)
raw=$backup_dir/$date_string-...-$backup_index.sql
compressed=$raw.tar.gz

# Remove old backup

rm -v $backup_dir/*-...-$backup_index.sql.tar.gz

# Create new backups

mysqldump -u ... -p... --databases ... --add-drop-database --add-drop-table > $raw
tar czf $compressed $raw
rm $raw
    
por 29.03.2012 / 00:48
0

Tem a certeza de que não tem acesso a find ? Ou simplesmente não está no caminho? Tente executá-lo como /usr/bin/find , veja se isso funciona para você.

Se isso não funcionar, você está em uma situação difícil. Se find não estiver disponível e você não tiver acesso a um shell, não saberá o que está disponível. Se o Perl estivesse disponível, seria um script perl razoavelmente trivial para executar a tarefa acima. Usando apenas shell. . . Eu provavelmente tentaria algo assim:

ls -t /backup_dir/*.db.tar.gz | sed "1,5d" | xargs rm -f

Onde 5 é o número de dias que você deseja manter (modifique conforme necessário).

Uma breve explicação: ls -t faz uma listagem do diretório, classificada por hora (mais recente primeiro). O sed "1,5d" informa sed para remover as primeiras 5 linhas da entrada (correspondendo aos nossos 5 arquivos mais recentes). Por fim, xargs combina a listagem e informa ao rm removê-los.

    
por 28.03.2012 / 01:17
0

Você disse que não tinha acesso ao shell. Supondo que você não quisesse ter acesso ao shell interativo, este script Bash exclui recursivamente db tarballs ao longo de 3 dias (calculado tomando a data atual e subtraindo 3 dias no valor de segundos e comparando com o tempo de modificação do tarball).

#!/bin/bash

for linkname; do
  if [[ -d "$linkname" ]]; then
    "$0" "$linkname"
  elif [[ "$linkname" =~ '^.*db\.tar\.gz$' ]]; then
    if (( $(stat --format=%y "$linkname") < ( $(date +%s) - 259200) )); then
      rm -f "$linkname" 
    fi
  fi
fi
    
por 29.03.2012 / 00:36