script de Ubuntu para conservar solo el archivo más reciente de cada carpeta y eliminar todo lo demás

script de Ubuntu para conservar solo el archivo más reciente de cada carpeta y eliminar todo lo demás

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 headpara enumerarlos todos menos el último ( -n -1) y elimina los archivos enumerados en un whilebucle.

Le sugiero que lo ponga echoantes rminicialmente 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)

información relacionada