
Tenemos un script que realiza copias de seguridad cada hora y las almacena dentro de una carpeta creada con la fecha de hoy.
#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
Entonces, habrá 24 archivos dentro de la carpeta.20072018y los nombres serán comoactual_000001.zip
Ahora nos estamos quedando sin espacio, así que decidimos mantener solo una copia de seguridad por día y eliminar todo lo demás.
Probé el siguiente script, que elimina todo excepto la copia de seguridad 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
Pero el problema es que durante algunos días la copia de seguridad número 23 no está disponible porque el servidor se apagó. ¿Cómo puedo modificar el script anterior para que verifiqueÚLTIMO ARCHIVO DE RESPALDO de cada fecha ¿Y conservar solo ese archivo y eliminar todo lo demás?
Respuesta1
Puedes usar:
ls /home/user/Desktop/cron_database_hourly/$DAY/*_[012][0-9]*.zip | head -n -1 | \
while read -r f; do rm "$f"; done
Esto encuentra todos los archivos comprimidos en el directorio ordenados lexicográficamente, luego los usa head
para enumerarlos todos menos el último ( -n -1
) y elimina los archivos enumerados en un while
bucle.
Le sugiero que lo ponga echo
antes rm
inicialmente para ver qué comandos se ejecutarán antes de usar live.
Respuesta2
Algo como
ls datedir | head -n -1 | xargs rm
(no probado, así que no sometas datos valiosos a esto sin probarlo)