it-swarm.com.de

Bash-Skript zum Löschen von Ordnern, die älter als 30 Tage sind, aber den ersten und den 15. Tag weglassen

Ich habe einen Mount, auf dem ich meine Datenbank-Backups speichere. Um zu verhindern, dass sie außer Kontrolle geraten, habe ich nur vor, Backups im Wert von 30 Tagen aufzubewahren, aber auch Backups, die alle 15 Tage erstellt werden. Nach Ablauf von 30 Tagen, wenn der Ordner am 1. oder 15. erstellt wurde, möchte ich, dass er auch erhalten bleibt.

Ich verwende dies derzeit nur, um die Backups 30 Tage lang aufzubewahren. Wie kann ich Ordner auslassen, die am 1. und 15. erstellt wurden?

find /mnt/clusterfs01-data01/db01/* -type d -ctime +30 -exec rm -rf {} \;

Beispielverzeichnisliste für Ordnernamen.

0 drwx------ 7 root root 324 Nov 11 01:35 2016-11-11_01-31-41
0 drwx------ 7 root root 250 Nov 11 06:25 2016-11-11_06-25-03

Ich habe nichts dagegen, eine andere Lösung als find.

1
user508889

Sie können Übereinstimmungen hinzufügen, die auf der datetime-Zeichenfolge des Verzeichnisnamens basieren

! \( -name '????-15-??*' -o -name '????-30-??*' \)

oder

-not \( -name '????-15-??*' -o -name '????-30-??*' \)

zum find Befehl.

Wenn Sie es wirklich auf den Zeitstempel stützen möchten, dann ist der einzige Weg, den ich mir vorstellen kann, so etwas wie (Anmerkung Ich verwende mtime hier seit Ihrem touch Befehle scheinen das ctime auf meinem System nicht zu ändern: change %Td bis %Cd für ctime):

find dir -type d -mtime +30 -printf '%Td\t%p\0' | 
    while read -rd '' day dir; do 
      case "$day" in 
        15|30) ;; 
        *) echo rm -rf -- "$dir";; 
      esac
    done
2
steeldriver

Probier diese:

rm -rf $(find /mnt/clusterfs01-data01/db01/* -maxdepth 0 -type d -ctime +30 | grep -v "[0-9]\{4\}-01\|15-[0-9]\{2\}")
1
Alex Sweetheart