Suche Add-On / Integration welches Dateien nach n-Tagen löscht oder umkopiert.

HaUsr23

Member
Da ich meine Kamera Bilder nun erfolgreich auf einer zusätzlichen Platte speichere möchte ich die Dateien, in unterschiedlichen Ordner gerne nur eine bestimmte Anzahl an Tagen aufbewahren und dann löschen oder ggf. verschieben.
Gibt es ein Add-On oder eine Integration die soetwas in Home Assistant machen kann ?
 
Moin,

keine Ahnung, ob es da etwas HA-spezifisches gibt, aber mit einem einfachen Bash-Script und dem Befehl "find" sollte sich sowas auch realisieren lassen.

Halt irgendwas in diese Richtung:

find /Pfad/zu/den/Dateien/ -name "<Platzhalter-Bildname>" -mtime +14 -delete

Ich würde aber vorher testen, bevor man sowas losrattern lässt.... Mittels "find" kannst Du halt suchen und auch eine Löschung vornehmen lassen. Als Trockenlauf würde es sich eher anbieten, dass man das "-delete" erstmal aussen vor lässt.

Alles nachfolgende findet im HomeAssistant-Terminal statt!

Vielleicht erstellst Du Dir auch erstmal ein paar Testdateien mit "touch". Zunächst mal einen Test-Ordner erstellen: mkdir /root/config/www/date-test und dann in diesen wechseln: cd /root/config/www/date-test. Unter Debian z.B. sind da ein paar Test-Dateien recht flott erstellt:

Bash:
touch -d "1 year ago" 1y.txt
touch -d "3 months ago" 3m.txt
touch -d "2 months ago" 2m.txt
touch -d "1 month ago" 1m.txt
touch -d "14 days ago" 14d.txt
touch -d "7 days ago" 7d.txt
touch -d "3 days ago" 3d.txt
touch -d "1 day ago" 1d.txt

Hab das grade mal unter HA getestet... funktioniert natürlich nicht. Im folgenden Format funktioniert es allerdings: "touch -t <YYYYMMDDHHSS> <Dateiname>", also z.B.:

touch -t 202412241800 frohe_weihnachten.txt oder touch -t 202501010000 frohes_neues.txt

Weisst schon... 😄 Das ganze natürlich in Einheiten, welche für Dich zum testen auch Sinn machen (wie z.B. die o.g. Beispiele). Mitunter auch einfach mit entsprechend klaren Dateinamen:

Bash:
touch -t 202505160000 20250516.txt
touch -t 202505130000 20250513.txt
touch -t 202505090000 20250509.txt
touch -t 202505020000 20250502.txt
touch -t 202504160000 20250416.txt

Und so weiter... halt so wie Du es brauchst... Prinzip sollte ja bis hier soweit klar sein (falls nicht, einfach fragen!) :)

In der Konsole kannst Du jetzt auch nochmal kurz einen Blick über die erstellten Dateien werfen. Um bei allen Dateien das vollständige Datum inkl. Uhrzeit sehen zu können (vor allem bei älteren!), braucht der Befehl "ls" allerdings noch einen Zusatz in Form von "--full-time", womit der konkrete Befehl dann ls --full-time lautet. Ansonsten werden bei älteren Dateien nur die Datumsangaben angezeigt - hier mal ein entsprechender Screenshot:

1747385500479.png

So... nun haben wir vermutlich schon einen Haufen Dateien zum testen erzeugt - nun geht es an die Filterung. Wie gesagt, lassen wir die Löschung erstmal aussen vor und schauen erstmal nur, dass wir auch die korrekten Ergebnisse bekommen. Das könnte dann z.B. so aussehen:

find /root/config/www/date-test/ -name "*.txt" -mtime +7 (älter als X-Tage)

Das sieht dann beim testen halt so aus:

1747386108919.png

Musste halt mal schauen, wie es dann für Dich passt. Danach kannst Du auch mal einen Lösch-Testlauf starten indem Du noch ein "-delete" hinter den Befehl hängst:

1747386346621.png

Wenn es dann wunschgemäß für Dich filtert, änderst Du den Befehl einfach mal auf das gewünschte Verzeichnis ab, gleiches dann eben auch für den Zeitraum z.B.:

find /Pfad/zu/den/gespeicherten/Bildern/ -name "*.jpg" -mtime +14

Natürlich zum testen erstmal ohne "-delete". Ich möchte an dieser Stelle nochmal darauf hinweisen, dass wir hier grade "nur" Dateien suchen, die dann auch "gelöscht" werden - nicht, dass noch die falschen Dinge gelöscht werden.

Wir wissen ja nun, dass ein "-delete" die gefundenen Dateien entfernt und müssen das "jetzt" auch erstmal nicht weiter testen. Vielmehr muss man sich jetzt darum kümmern, dass ein entsprechendes Script erstellt wird. Am Anfang eines jeden Bash-Scripts steht die Shebang und diese sieht bei Bash dann einfach so aus: #!/bin/bash. Ansonsten kann man im Script dann auch einfach die Konsolenbefehle nutzen, womit das "Script" dann eigentlich auch nur aus 2 Zeilen besteht:

Bash:
#!/bin/bash
find /Pfad/zu/den/gespeicherten/Bildern/ -name "*.jpg" -mtime +14

Kannst Du mittels irgendeinem Editor erstellen, oder dem Kram einfach direkt aus der Shell in eine Datei pumpen. Hier beispielhaft mal der Dateiname "script.sh", kannst Du aber nennen wie Du lustig bist.

echo '#!/bin/bash' > script.sh
echo 'find /Pfad/zu/den/gespeicherten/Bildern/ -name "*.jpg" -mtime +14' >> script.sh

Danach muss das Script noch ausführbar gemacht werden:

chmod +x script.sh

Dann das Script auch einmal testen mittels ./script.sh. Wenn alles läuft, wie Du es Dir vorgestellt hast, packst Du im Script (ggf. in HA über den Editor) noch kurz das "-delete" hinten an den find-Befehl und das Script ist einsatzbereit.

Alles weiter dann "vermutlich" (weisst ja, bin nicht so der HA-Crack) einfach via HomeAssistant - Shell Command, wobei Du vermutlich auch einfach den find-Befehl darüber starten könntest, aber warum einfach, wenn es auch kompliziert geht und die Shell-Scripte kannst Du auch abseits von HomeAssistant nutzen (wer weiss schon, was die Zukunft noch so bringt) 🙃
 
@blurrrr
Leck mich fett, was nee Antwort, Respekt, und vielen Dank !!

Das führe ich mir mal zu Gemüte und spiele "etwas" rum, hab ja jetzt mal nen Ansatz (y)
Werde berichten !
 
Hallo @blurrrr,
(y) super Anleitung.
@HaUsr23 und damit Du das nicht händig machen musst startest Du das Script am besten mit Crontab.
Z.B. "* 13 * * * /scripts/./meinscript.sh" das passiert dann automatisch jeden Tag um 13:00 Uhr.
 
Glaube das ist unter HA garnicht mal so einfach, ggf. eher in Kombi mit time-trigger. Der Zugriff auf das HA-System ist ja schon ziemlich verrammelt, so wie ich das mitbekommen habe. Auf jedem anderen System wäre Cron auch mein Vorschlag gewesen 🙃
 
Stopp, stopp, bevor es zu viel Informationen gibt...

Ich habe mir in der configuration.yaml mal folgendes angelegt:
YAML:
shell_command:
  delete_jpg: find /root/media/ -name "*.jpg" -mtime +1 -delete
  delete_mp4: find /root/media/ -name "*.mp4" -mtime +1 -delete
(testweise nur 1 Tag alte löschen)

In einer Automation, die ich um 0:05 triggere, werden beide Befehle ausgeführt.

Ich habe die find's im Terminal mal entsprechend mutig ausgeführt und es war von Erfolg gekrönt !

Wenn das mit den configuration Shell Commands nun genau so gut funktioniert, bin ich vollkommen zufrieden !

Stellt sich mir nur die Frage: Arbeitet find rekursiv durch alle Unterverzeichnisse von /root/media/ ? Oder muss da noch ein Parameter dran ?

Genaueres morgen, theoretisch :)
 
Das ist rekursiv, durchsucht also auch Unterverzeichnisse (steht aber auch alles im z.B. Ubuntu-Wiki). Insofern wäre ich also schon extrem vorsichtig, was die Pfadauswahl angeht. Im besten Fall wandern die Aufnahmen in ein eigenes Verzeichnis und auch nur dieses wird mit dem Befehl beackert. Ansonsten gehen vielleicht auch Bilder verloren, die eigentlich ganz anderen Dingen zugeordnet sind (aber halt älter als X Tage sind).
 
Danke für die Warnung blurrrr, aber in meinem Fall passt es wenn der alle unterhalb des Verzeichnisses entsorgt, dass sind nur temporäre Aufnahmen.
Ich glaub dafür muss ich das +1 dann doch durch +0 ersetzen.
Dann bin ich nun mal gespannt ob das morgen gelöscht wurde...
 
Versteh ich nicht so ganz, liegt Dir nichts an den Aufnahmen bzw. wofür nimmst Du dann überhaupt auf, wenn sowieso alles direkt gelöscht wird? Normalerweise hält man Aufnahmen doch zumindestens eine gewisse Zeit vor (ein paar Tage/Wochen)?

Wenn es Dir so brandeilig ist, dass die Aufnahmen entsorgt werden... es gäbe z.B. auch noch mmin (Minuten) statt mtime (Tage). Weiss nur nicht, ob das unbedingt Sinn und Zweck der Sache ist? :unsure:
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
6.680
Beiträge
64.115
Mitglieder
6.935
Neuestes Mitglied
Syndikat
Zurück
Oben