ubuntu-Skript, um nur die neuesten Dateien aller Ordner beizubehalten und alles andere zu löschen

328
Ash

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?

0

2 Antworten auf die Frage

0
Henrik

So etwas wie

ls datedir | head -n -1 | xargs rm 

(ungeprüft, daher sollten Sie keine wertvollen Daten ohne Prüfung testen)

0
AFH

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 headalle bis auf die letzten ( -n -1) aufgelistet und die aufgelisteten Dateien in einer whileSchleife entfernt.

Ich schlage vor, Sie legen echovor rmBeginn, um zu sehen, was vor der Live ausgeführt werden Befehle.

Danke Das Problem ist jedoch im Verzeichnis cron_database_hourly. Dort werden viele Ordner nach dem jeweiligen Datum benannt. Ex: 20072018, 21072018 und ich möchte Dateien aus all diesen Verzeichnissen löschen, und ich muss diese Regeln für Dateien anwenden, die nur 30 Tage alt sind. Ash vor 5 Jahren 0
Sie können nicht dieselbe Technik für die Verzeichnisse verwenden, da die zeitliche Reihenfolge nicht der lexikographischen Reihenfolge entspricht. Wenn Ihr Dateisystem nicht das Geburtsdatum von Dateien unterstützt, können Sie auch `find -newerXY` nicht zuverlässig verwenden. Wenn Sie das Verzeichnisformat in `DAY = $ (/ bin / date +% Y% m% d)` geändert haben, entspricht die zeitliche Reihenfolge der Lexikographie. Andernfalls müssen Sie für die Spalten, die Jahr, Monat und Tag enthalten, eine Reihe von drei Sorten verwenden. Es ist zu lang für einen Kommentar, aber wenn Sie eine neue Frage stellen, werde ich versuchen, sie zu beantworten. AFH vor 5 Jahren 0
Ich habe eine separate Frage erstellt: https://superuser.com/questions/1342472/script-to-remove-all-but-retain-one-one-latest-backup-file-of-all-sub-directories Ash vor 5 Jahren 0
Ihre neue Frage hat die Anforderung, dass die Dateien 30 Tage alt sein müssen, beseitigt, wodurch das Problem erheblich vereinfacht wird. Ist das keine Einschränkung mehr? es macht das Problem sicherlich viel einfacher. AFH vor 5 Jahren 0