
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, head
listet dann alle bis auf die letzte auf ( -n -1
) und entfernt die aufgelisteten Dateien in einer while
Schleife.
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)