script ubuntu para reter apenas o arquivo mais recente de cada pasta e excluir todo o resto

0

Temos um script que faz backups por hora e armazena dentro de uma pasta criada como a data de hoje.

#CRONJOB TO BACKUP DB HOURLY

DAY=$(/bin/date +%d%m%Y)
TIME=$(/bin/date +%H%M%S)

if [ ! -d /home/user/Desktop/cron_database_hourly/$DAY ]; then
  sudo mkdir /home/user/Desktop/cron_database_hourly/$DAY
fi
sudo chmod -R 755 //home/user/Desktop/cron_database_hourly/$DAY
cd /home/user/Desktop/cron_database_hourly/$DAY/

mysqldump -u root -p'password' current > current_$TIME.sql

zip current_$TIME.zip current_$TIME.sql > /dev/null 2>&1

sudo rm current_$TIME.sql

Portanto, haverá 24 arquivos dentro da pasta 20072018 e os nomes serão como current_000001.zip

Agora estamos ficando sem espaço, então decidimos manter apenas um backup por dia e excluir todo o resto.

Eu tentei o seguinte script, que exclui tudo, exceto o backup de 23 horas.

sudo find /home/user/Desktop/cron_database_hourly/* -type f \( -name "*_00*.zip" -o -name "*_01*.zip" -o -name "*_02*.zip" -o -name "*_03*.zip" -o -name "*_04*.zip" -o -name "*_05*.zip" -o -name "*_06*.zip" -o -name "*_07*.zip" -o -name "*_08*.zip" -o -name "*_09*.zip" -o -name "*_10*.zip" -o -name "*_11*.zip" -o -name "*_12*.zip" -o -name "*_13*.zip" -o -name "*_14*.zip" -o -name "*_15*.zip" -o -name "*_16*.zip" -o -name "*_17*.zip" -o -name "*_18*.zip" -o -name "*_19*.zip" -o -name "*_20*.zip" -o -name "*_21*.zip" -o -name "*_22*.zip" \) -mtime +30 -delete

Mas o problema é que em alguns dias o backup 23 não está disponível porque o servidor foi desligado. Como posso modificar o script acima para verificar o arquivo de backup mais recente de cada data e reter apenas esse arquivo e excluir todo o resto?

    
por Ash 20.07.2018 / 15:36

2 respostas

0

Você pode usar:

ls /home/user/Desktop/cron_database_hourly/$DAY/*_[012][0-9]*.zip | head -n -1 | \
       while read -r f; do rm "$f"; done

Isso localiza todos os arquivos archive no diretório classificado lexicograficamente, depois usa head para listar todos, exceto o último ( -n -1 ) e remove os arquivos listados em um loop while .

Eu sugiro que você coloque echo antes de rm inicialmente, para ver quais comandos serão executados antes de usar ao vivo.

    
por 20.07.2018 / 16:04
0

Algo como

ls datedir | head -n -1 | xargs rm

(não testado, então não submeta dados preciosos a isso sem testar)

    
por 20.07.2018 / 16:03