Hallo zusammen,
ich habe mir ein Bash Backup Script erstellt, dass zunächst aus verschiedenen Quellen einige Daten zusammen sucht und dann mittels Borg und rsync die Daten auf eine zusätzliche interne Festplatte und zu einem Raspi sichert. Alles was in dem Script so passiert, gebe ich in einem Logfile aus. Die Logfiles speichere ich in einem Ordner logs. Am Abend stoße ich dann manuell das Backup an und es entsteht ein neues Borg Archiv. Jedoch "prune" ich die Archive auch mit Borg über das Backup Script, so dass ich nur für die letzten Tage, Woche, Monate und Jahre entsprechende Archive vorhalte. Die Logfiles sind aber unabhängig von den Borg Archiven und werden nicht automatisch gelöscht, wenn ggf. ein Archiv "geprunt", sprich aus dem Borg Repository entfernt wird. Über die Zeit hat sich der Logfile-Ordner nun mit vielen Logsfiles gefüllt und dies will ich nun mal "aufräumen".
Als kleine Lernübung für die Bash-Programmierung habe ich mir daher mal folgende Aufgabe gestellt:
Lösche alle Dateien in einem Ordner, die nicht in einer vorgegeben Liste enthalten sind!
Da ich Hobbymäßig eher in C++ und Qt unterwegs bin, kann man bash-mäßig sicher einiges optimieren. Ggf. hat der eine oder andere da einige Hinweise für mich.
Die Ausgabe von borg list pfad_zum_borg_repo
sieht so aus:
... 2020-10-23T20-22-54 Fri, 2020-10-23 20:23:55 [c857c1667aff14ebd80f0b5130e0671d8e613139a1fc68d8f5eab3290bc7543c] 2020-10-24T19-13-21 Sat, 2020-10-24 19:16:33 [d1f903e58c8930f68a8b33f1734d0a3167b7120c03b532bf7f814e9ce927fbd4] 2020-10-25T20-04-44 Sun, 2020-10-25 20:05:49 [8443a27e9ee5c061d52334c07e67ca8c512c7c248d50874de9192e2b919ea5dd] 2020-10-27T00-10-23 Tue, 2020-10-27 00:11:25 [c9bae83951286afca6c014c118783791e3212e2dadcabf02de7a989d230919f4] ...
In der ersten Spalte stehen die Archivnamen und diese sind dann gleich wie Namen der Logfiles, z.b.: ./logs/2020-10-27T00-10-23.log
. Nur die Files die gleich sind mit den noch vorhanden Archiven (1. Spalte) will ich in dem Ordner behalten und alle anderen löschen.
Hier mein Script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #!/bin/bash declare -a archiveNames declare -a filesToDelete # Zunächst lese ich die Archivnamen in ein Array while IFS=' ' read -r -a line ; do # echo ${line[0]} archiveNames+=(${line[0]}) done < <(borg list pfad_zum_borg_repo) # Hier verstehe ich die Syntax nicht: done < <(borg ... was hat es mit den zwei < auf sich? echo "No of archives=${#archiveNames[@]}" # Dann prüfe ich die Archivnamen mit den Logfilenamen und speichere die zu löschenden Logfilenamen in einen weiteren Array while read -r -d $'\0' fileName; do found=0 # echo $(basename -s .log $fileName) for archivName in "${archiveNames[@]}"; do if [ $archivName == $(basename -s .log $fileName) ]; then echo "Found: ${archivName} == ${fileName}" found=1 break fi done [ $found == 0 ] && filesToDelete+=($fileName) done < <(find ./logs/*.log -print0) echo "No of files to delete=${#filesToDelete[@]}" # Und dann lösche ich die überflüssigen Logsfiles [ ${#filesToDelete[@]} != 0 ] && rm ${filesToDelete[@]} |
Danke für Anregungen.
kkarsten62