Ich bin mir nicht sicher, ob dies das letzte Datum innerhalb des aktuellen Tages ist oder ob es nur 30 oder 31 Tage dauert.
z.B
Wenn das aktuelle Datum ist March 28th
, muss es 1 Monat her sein February 28th
, aber was passiert, wenn es ist March 30th
?
Szenario
Ich möchte jeden Tag einige Dateien sichern. Das Skript speichert diese Dateien innerhalb des aktuellen Datums mit dem $(date +%Y%m%d)
Format. 20150603_bckp.tar.gz
Wenn dann der nächste Monat eintrifft, entfernen Sie alle diese Dateien innerhalb eines Monats mit Ausnahme der Dateien des ersten und des 15. Monats mein Zustand:
past_month = $(date -d "-1 month" +%Y%m%d)
day = $(date +%d)
if [ "$day" != 01 ] && [ "$day" != 15 ]
then
rm /path/of/files/${past_month}_bckp.tar.gz
echo "Depuration done"
else
echo "Keep file"
fi
Aber ich möchte wissen, was passiert, wenn der Termin der 30., 31. oder sogar der vergangene Februar ist. Es wird diese Dateien behalten? oder am ersten Tag Dateien entfernen?
Wenn es der 31. ist, wird die Depuration ausgeführt. Wenn also der letzte Monat nur 30 Tage hatte, wird dadurch die erste Datei des Tages entfernt.
Ich hoffe ich habe angedeutet.
Antworten:
- 1 month
subtrahiert eins von der Monatszahl, und wenn das resultierende Datum nicht gültig ist (February 30
z. B.), stellen Sie es so ein, dass es gültig ist. AlsoDecember 31 - 1 month
istDecember 1
kein Tag im November undMarch 31 - 1 month
istMarch 3
(sofern nicht in einem Schaltjahr ausgeführt).Hier ist ein Zitat von der Infoseite für Gnu
date
(diedate
Version, die diese Syntax implementiert), das einen guten Vorschlag enthält, um die Arithmetik robuster zu machen:Eine weitere Warnung, auch aus der Infoseite zitiert:
quelle
date
Implementierung erwarten würde . in meinem Buch ist es semantisch kontraintuitiv. - Danke für den Hinweis, es ist gut zu wissen.Anstatt sich beim Löschen Ihrer Sicherungsdateien auf Dateinamen zu verlassen, sollten Sie sich sicherer auf deren Zeitmetadaten verlassen.
Beispielsweise können Sie mit diesem Befehl alle Dateien löschen, die älter als 30 Tage sind:
Wenn Sie diese Option täglich ausführen, können Sie Ihre Sicherungsdateien in einem ununterbrochenen Monat aufbewahren und so den Speicherplatz auf der Festplatte besser verwalten.
Um die 1. oder 15. Datei zu behalten, können Sie sie entweder in einem anderen Verzeichnis speichern oder den Befehl find mit der Option -not -name aktualisieren.
quelle
Sie können versuchen, wie das Datum folgendermaßen funktioniert:
Ich denke also, dass basierend auf dem aktuellen letzten Monat (nicht aktuell, wenn dies März ist) die Anzahl der Tage des letzten Monats gegenüber dem aktuellen Monat verringert wird.
Sie können die folgende Syntax verwenden, um Dateien zu löschen, die älter als einige Tage sind (im Beispiel unter 31 Tagen). Eine Zeile, um das Problem zu lösen (dies ist ein einfacher Ansatz).
Für eine detailliertere Vorgehensweise können Sie auch Folgendes tun: 1. Ermitteln der Anzahl der Tage für den aktuellen Monat:
Anzahl der Tage des letzten Monats ermitteln:
Echo "$ (cal $ (Datum +% m) $ (Datum +% y) | egrep -v" $ (Datum +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (Datum -d "vor +1 Monat" +% m) $ (Datum +% y) | egrep -v "$ (Datum +% y) | Su" | xargs | awk '{print $ NF}') | bc
Nun finden wir den Unterschied zwischen diesen beiden Monaten:
Echo "$ (cal $ (Datum +% m) $ (Datum +% y) | egrep -v" $ (Datum +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (Datum -d "vor +1 Monat" +% m) $ (Datum +% y) | egrep -v "$ (Datum +% y) | Su" | xargs | awk '{print $ NF}') | bc
Weisen Sie diesen 3 Schritten nun einige Variablen zu. Schritt 1 Variablenname: FCM Schritt 2 Variablenname: FLM Schritt 3 Variablenname: DCL
Überprüfen Sie, ob $ DCL gleich 0 (Null) ist, und löschen Sie basierend auf der Differenz zwischen $ FCM und $ FLM:
Sie können auch eine Variable zu "/ path / to / folde / with / arhives /" hinzufügen.
Fazit: Wenn Sie Dateien löschen möchten, die älter als genau ein Monat sind, müssen Sie die genaue Anzahl der Tage anpassen, wenn Sie den Befehl "date" und "+1 month ago" verwenden.
quelle