Ubuntu-Skript, um nur die neueste Datei jedes Ordners beizubehalten und alles andere zu löschen

Ubuntu-Skript, um nur die neueste Datei jedes Ordners beizubehalten und alles andere zu löschen

Wir haben ein Skript, das stündlich Backups erstellt und diese in einem Ordner mit dem aktuellen Datum speichert.

#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

Es befinden sich also 24 Dateien im Ordner20072018und die Namen werden sein wieaktuell_000001.zip

Da uns nun der Speicherplatz ausgeht, haben wir beschlossen, nur ein Backup pro Tag aufzubewahren und alles andere zu löschen.

Ich habe das folgende Skript ausprobiert, das alles außer dem Backup in der 23. Stunde löscht.

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

Das Problem ist jedoch, dass an manchen Tagen das 23. Backup nicht verfügbar ist, da der Server heruntergefahren wurde. Wie kann ich das obige Skript ändern, damit es prüft, obNEUESTE SICHERUNGSDATEI jedes Datums und nur diese Datei behalten und alles andere löschen?

Antwort1

Sie können verwenden:

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

Dies findet alle Archivdateien im Verzeichnis in lexikografisch sortierter Form, headlistet dann alle bis auf die letzte auf ( -n -1) und entfernt die aufgelisteten Dateien in einer whileSchleife.

Ich schlage vor, dass Sie zunächst echo„vorher“ eingeben rm, um zu sehen, welche Befehle ausgeführt werden, bevor Sie es live verwenden.

Antwort2

Etwas wie

ls datedir | head -n -1 | xargs rm

(ungetestet, also setzen Sie wertvolle Daten diesem Risiko nicht ungetestet aus)

verwandte Informationen