Backup in die Cloud / Anfänger sucht Unterstützung

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
dermaxem
User
Beiträge: 20
Registriert: Montag 30. Mai 2022, 16:53

Moin,
für eine Überwachung habe ich einen älteren Pi mit einer USB-Cam und Motion im Einsatz.
Motion erzeugt viele JPG-Bilder. Diese haben das Format YYYYMMDDxxxxxx-xx. jpg (20240410213346-01.jpg), kann aber auch angepasst werden.
Der Ordner ist: /var/lib/motion/

Ziel: Backup der vielen einzelnen Datein in ein ZIP und sichern des ZIPS auf ein anderes Laufwerk (Cloud).
Der PI hat Netzanbindung mit Kabel zum Router.
Meine Idee:
Ich erstelle mir ein Script, das manuell oder zeitgesteuert aufgerufen wird.
Das Script soll alle Bilder die älter sind als Heute in ein ZIP verschieben.
Bilder mit Tagesdatum bleiben unberüht bis sie dann morgen drann sind.
Das ZIP soll via einer passende Transportmethode auf ein OneDrive oder Googledrive gebracht werden.
Nach erfolgreichem Transport soll das ZIP gelöscht werden.

Vorgehen:
Startzeit des Scripts festhalten (YYYYMMDD-hhmmss)
Damit das ZIP generieren
(Infos dazu habe ich von: https://hellocoding.de/blog/coding-lang ... -erstellen
Mit "Datum-1tag" die Datein behandeln und in das ZIP verschieben.
ZIP transportieren, wenn Transport erfolgreich, dann löschen.
Bei Transportfehler die Datei ncht löschen.
-
Meine Fragen dazu:
Wie generieren ich aus dem Datum einen Filename für das ZiP?
Wie identifizieren und behandle ich die Files im Ordner, die in das ZIP sollen?
Also erkkenen, welche von heute sind und nicht in das ZIP sollen?
Als Anregung dazu habe ich folgendes gefunden:

Code: Alles auswählen

filenames = [<array der files aus dem ordner>] # wie auch immer das gelesen wird.....
today = datetime.today().replace(hour=0, minute=0, second=0, microsecond=0)

for file in filenames:
    timestring = file[:8]
    date_object = datetime.strptime(timestring, '%Y%m%d')
    if date_object < today:
    # ins zip schieben
-
Als Neuling habe ich aber keine Ahnung, wie ich das umsetze.
Hier würde ich gerne Hilfe zur Selbsthilfe, Beispiele, usw. erhalten, wie ich das machen kann.
Es gibt ja bekanntlich immer mehrere Wege nach Rom.
Freue mich auf Anregungen zu meinem kleinen Projekt.
Danke Euch
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dieses Skript zeigt, wie man aus Dateien mit dem gegebenen Namensschema das Datum extrahiert, und dann basierend auf einem Zeitpunkt aufsammelt.

Code: Alles auswählen

import pathlib
import tempfile
import random
import datetime


def generate_test_data(start_date, path):
    offset = datetime.timedelta(minutes=0)
    for i in range(20, 0, -1):
        d = start_date - offset
        filename = f"{d.strftime('%Y%m%d%H%M%S')}-{i:02}.jpeg"
        offset += datetime.timedelta(minutes=random.randint(10, 100000))
        full_path = path / filename
        full_path.write_text("Ich bin ein Bild")


def collect_files_older_than(cutoff, directory):
    res = []
    for path in directory.rglob("*.jpeg"):
        name = path.name
        creation_date = datetime.datetime.strptime(name.split("-")[0], '%Y%m%d%H%M%S')
        if creation_date < cutoff:
            res.append(path)
    return res


def main():
    today = datetime.datetime.now()
    with tempfile.TemporaryDirectory() as td:
        td = pathlib.Path(td)
        generate_test_data(today, td)

        cutoff = today
        while True:
            files_to_archive = collect_files_older_than(cutoff, td)
            if files_to_archive:
                print(files_to_archive)
            else:
                break
            cutoff -= datetime.timedelta(days=1)


if __name__ == '__main__':
    main()
dermaxem
User
Beiträge: 20
Registriert: Montag 30. Mai 2022, 16:53

Hallo Deets,

danke für das Script. Da passiert auch was, wenn man es startet, aber ich kann damit leider (noch) nichts anfangen ohne Zeile für Zeile zu übersetztten, um zu verstehen, was da genau passiert.
Die Ausgabe sieht so aus:
Output-file
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Naja, du musst es halt durcharbeiten. Es erzeugt eine Liste von 20 "kuenstlich gealterten" Dateien, und zeigt dann einfach nur, das man mit collect_files_older_than mit einm Pfad und einem cutoff-Datum alle Dateien bekommt, die aelter sind.
Antworten