@djwieli: Die ”magischen” Methoden mit den doppelten Unterstrichen sollte man nur aufrufen wenn das unbedingt nötig ist. Die `__contains__()`-Methode ist für den ``in``-Operator gedacht, den man dann auch benutzen sollte.
Pfadteile setzt man mit `os.path.join()` zusammen, nicht mit ``+``. Ein abschliessendes Pfadtrennzeichen ist nicht nötig.
Das `folder` der einzige Englische Name ist, fällt irgendwie aus dem Rahmen. Ich würde ja komplett Englisch verwenden, aber auf jeden Fall konsequent nur *eine* Sprache. `folder` und `datei` sind auch inhaltlich falsch, weil es sich bei beiden nicht um einen Ordner oder eine Datei handelt, sondern jeweils um einen Ordner*namen* und einen Datei*namen*. Zum einen ist insbesondere `datei` irreführend, weil man bei dem Namen ein Objekt erwarten würde das `read()` oder `write()`-Methoden hat, eben ein Dateiobjekt, aber auch der Ausdruck ``folder in datei`` verwirrt extrem. Denn eigentlich sind ja Dateien in Ordnern und nicht umgekehrt, oder man denkt beim lesen `datei` ist ein zum lesen geöffnetes Dateiobjekt und der Ausdruck prüft ob eine Zeile mit dem Ordnernamen in der Datei enthalten ist. Eigendlich sollte das aber ``ordnername in dateiname`` heissen, was wesentlich besser und eindeutiger beschreibt was da passiert.
Man sollte sich nicht blind darauf verlassen das `folder` tatsächlich nur an Ordnernamen gebunden wird, sondern das explizit testen.
Der komplette Zielordnername wird zweimal exakt gleich zusammengesetzt. Wenn man testet ob das tatsächlich ein Verzeichnis ist, dann braucht man den sogar dreimal, man sollte den Namen aber nur einmal erstellen.
Beim äusseren `os.listdir()` würde sortieren sicherstellen, das bei Mehrdeutigkeiten vorhersehbarer ist, wo verschobene Dateien landen werden.
Das innere `os.listdir()` wird für jeden Durchlauf der äusseren Schleife aufgerufen. Das kann man sich sparen wenn man die Erstellung dieser Liste aus den Schleifen heraus zieht. Eventuell möchte man auch hier sicherstellen, dass es sich ausschliesslich um Dateinamen handelt und keine Verzeichnisse dabei sind?
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
import os
import shutil
ARCHIVORDNERNAME = '/opt/fhem/log/archivedlogs'
LOGORDNERNAME = '/opt/fhem/log'
def main():
#
# TODO Maybe filter to just file names, without directories‽
#
dateinamen = os.listdir(LOGORDNERNAME)
for ordnername in sorted(os.listdir(ARCHIVORDNERNAME)):
zielordnername = os.path(ARCHIVORDNERNAME, ordnername)
if os.path.isdir(zielordnername):
for dateiname in dateinamen:
if ordnername in dateiname:
print(f'verschiebe {dateiname!r} nach {zielordnername!r}')
shutil.move(
os.path.join(LOGORDNERNAME, dateiname), zielordnername
)
if __name__ == '__main__':
main()