So etwas wie
ls datedir | head -n -1 | xargs rm
(ungeprüft, daher sollten Sie keine wertvollen Daten ohne Prüfung testen)
Wir haben ein Skript, das stündliche Backups erstellt und in einem Ordner speichert, der als heutiges Datum erstellt wurde.
#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
Im Ordner 20072018 befinden sich also 24 Dateien, und die Namen werden wie current_000001.zip lauten
Jetzt haben wir keinen Platz mehr, also haben wir beschlossen, nur ein Backup pro Tag zu behalten und alles andere zu löschen.
Ich habe das folgende Skript ausprobiert, das alle Backups außer 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 einigen Tagen die 23. Sicherung nicht verfügbar ist, weil der Server heruntergefahren wurde. Wie kann ich das obige Skript so ändern, dass nach LATEST BACKUP FILE für jedes Datum gesucht wird und nur diese Datei beibehalten und alles andere gelöscht wird?
So etwas wie
ls datedir | head -n -1 | xargs rm
(ungeprüft, daher sollten Sie keine wertvollen Daten ohne Prüfung testen)
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
Dadurch werden alle Archivdateien im Verzeichnis lexikographisch sortiert angezeigt, anschließend werden head
alle bis auf die letzten ( -n -1
) aufgelistet und die aufgelisteten Dateien in einer while
Schleife entfernt.
Ich schlage vor, Sie legen echo
vor rm
Beginn, um zu sehen, was vor der Live ausgeführt werden Befehle.