Batch Windows-Dateiensuche möglich?

Problem ist anscheinend, dass das Python-Skript bei der Namens-Generation den gesamten Pfad-String nutzt, anstatt in Dateiname + Zähler + Endung zu teilen.
 
  • Gefällt mir
Reaktionen: Marvolo
Falls es eventuell zudem noch möglich wäre, dass es alle doppelten Dateien in einen separaten Ordner kopiert - das würde dann Vieles übersichtlicher machen.
 
Marvolo schrieb:
Es nummeriert die doppelten Dateien nun NACH der Dateiendung, wodurch die Datei damit unbrauchbar wird
Liegt daran, dass ich das zum Prinzip aufzeigen so gemacht habe. Ich finde es ja immer etwas seltsam, dass Windows beim Umbenennen von Dateien den Begriff "unbrauchbar" verwendet. Als ob der Name auch den Inhalt verändern würde.
Marvolo schrieb:
Brauche ich das Python-Script nun überhaupt noch? Ich habe jetzt einfach diese Kopieren.bat-Datei gestartet,
Das Python Skript ist in dem Fall gerade dazu da, die Batchdatei zu erzeugen. Du brauchst dann kein Pythonskript mehr, wenn du die Batchdatei hast.

Ja, Dateien mit Dopplungen kann man recht einfach identifizieren und woanders hin kopieren.
Evtl komm ich heut Abend dazu, dir das anzupassen.
 
  • Gefällt mir
Reaktionen: Marvolo
@simpsonsfan

Dankeschön.

Was eventuell auch noch interessant wäre:
Gibt es eine Möglichkeit, die zwei Dateien Search.txt & Output.txt miteinander so zu vergleichen, dass am Ende in einer neuen TXT-Datei nur all jene Medien-Pfade stehen, die im Medienordner nicht vorhanden sind?

Also die Search.txt-Datei listet ja alle Medien im Suchordner/Medienordner auf. Die Output-Datei hingegen listet alle Medien auf, die WhatsApp verlangt bzw. braucht.

Wenn man nun in einer neuen TXT-Datei nur all jene Medien listet, die WA zwar in der Output-Datei fordert, die aber im Medienordner (also in der Search-txt-Datei) nicht vorhanden sind, dann könnte ich diese neue TXT-Datei wiederum als frische "output-2-txt"-Datei nutzen, um weitere Ordner nach genau diesen noch fehlenden Einträgen durchsuchen zu lassen.

Ich hoffe, es ist verständlich, was ich meine.
 
@mae1cum77

Ich müsste eine neue Search.txt Indexdatei erstellen lassen. Die alte ist nun obsolet, da ich dem Medienordner noch einige weitere Dateien hinzugefügt habe.

Es müsste also lediglich die Search.txt neu schreiben - nicht kopieren, das geht ja schneller mittels des Python-Scripts.

Wie muss ich dein Script so abändern, dass es nur die Indexdatei neu schreibt, aber nicht auch gleich kopiert?

Vielen Dank
 
Marvolo schrieb:
Wie muss ich dein Script so abändern
Code:
echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
pushd "%~dp0"
cd "%~dp0"
if exist "search.txt" del /s /q "search.txt" >nul
for /r "e:\backup" %%A in (*.*) do echo %%~nA | findstr /l "WA0" 1>nul && echo %%A>>search.txt
pause
endlocal
exit

Löscht alte search.txt (wenn vorhanden) und erstellt dann die neue für alle Dateien mit WA0 im Namen.
 
  • Gefällt mir
Reaktionen: Marvolo
Dankeschön. Der Medienordner ist aber mittlerweile F:\Medien\, das heißt, einfach Zeile 7 entsprechend abändern?
 
  • Gefällt mir
Reaktionen: s1ave77
Also die Ausgangslage ist nun:

ich habe jetzt verschiedene output.txt-Dateien (da verschiedene WhatsApp-Medienanforderungen) und eine zentrale Search.txt-Datei, die sämtliche WA Dateien enthält.

Jetzt müsste ich nur noch das Skript soweit bekommen, dass es je nach verwendeter Output Datei die entsprechenden, gefundenen Dateien raus kopiert. Das letzte Python-Skript bzw. diese neue BAT-Datei war da schon sehr schnell, aber soweit ich das erkenne, arbeitet die fest mit der allerersten output-Datei.

Da ich aber nun verschiedene Output-Dateien habe, mal mit mehr mal mit weniger Einträgen, je nach WA-Datenbank, müsste ich nun einfach per Pfad im Code auf die jeweils zu verwendende Output-Datei verweisen und dann geht's los?

Allerdings wäre es noch gut, wenn das Script die doppelten Dateien nicht auch in den Hauptordner zu den anderen kopiert, sondern alle doppelt-gefundenen vielleicht in einen extra-Ordner. Da ich nur in wenigen Fällen auf die doppelten Daten zurückgreifen muss, reicht es dann aus, wenn ich mir die aus dem Extra-Ordner dann rauspicke.

Wenn mir jemand erklärt, wie ich eine der neuen output-Dateien ebenfalls in so eine BAT-Datei, wie in #98 kriege, sodass es dann direkt loskopiert, dann würde ich das mal versuchen.

Oder ist es über das PY-script besser als über BAT? Solangsam verliere ich da auch den Überblick, was jetzt nun für was ist und was die beste Methode ist.
 
Marvolo schrieb:
Oder ist es über das PY-script besser als über BAT? Solangsam verliere ich da auch den Überblick, was jetzt nun für was ist und was die beste Methode ist.
Momentan erzeugt das PY-Skript die CMDs für Ordner und Copy, kann sie schnell und zuverlässig. Copy ist bei CMD gut aufgehoben.

Problem ist das PY mit der Namensgeneration.

Poste mal die aktuelle search.txt und eine output.txt zu Testen. Da ja nur Textdateien generiert werden, läßt sich das auch ohne IMG-Dateien testen.
 
Hier die nun aktuelle Search.txt-Datei. Die sollte sich jetzt auch nicht mehr ändern, denn obwohl ich Mediendateien früher als 2016 habe, geht die früheste WA-Datenbank leider mangels Entschlüsselungs-Key nur bis 2016.

Search.txt

Die Output-Dateien werden noch etwas variieren, je nach gerade verwendeter Datenbank.
Hier mal die drei wichtigsten, an denen ich zurzeit arbeite:

https://www.file-upload.net/download-15351020/output1.txt.html
https://www.file-upload.net/download-15351021/output2.txt.html
https://www.file-upload.net/download-15351022/output-main.txt.html

Die "Main" ist dabei diejenige, die ich hier schon gepostet hatte. Die anderen 2 sind vom Umfang her weniger groß.
 
  • Gefällt mir
Reaktionen: s1ave77
Etwas länger geworden, dafür ein paar Kommentare dran.
Die search.txt musst du ggf. vorher wieder in UTF-8 encodieren, oder du ersetzt Zeile 34 (with open(indexfilename, encoding="utf8") as f2) durch (with open(indexfilename) as f2).
Am besten einfach mal schauen. Macht jetzt 4 Dateien, 3 Batch Dateien und eine Liste nicht gefundener Dateinamen.

Python:
import os
import pathlib
import shutil


target_root = os.path.abspath("F:/gefunden")
target_dopplungen = os.path.abspath("F:/gefunden/Dopplungen")

outputfilename = "scratch/output.txt"
indexfilename = "scratch/search.txt"


map = {}
# Einlesen der Pfade (die WhatsApp möchte) aus output.txt
with open(outputfilename, encoding="utf8") as f1:
    count_dup = 0  # Duplikatzähler für Dateinamen in output.txt
    for db_file in f1.readlines():
        # print(db_file)
        path, filename = os.path.split(db_file)
        target_folder = os.path.relpath(path, "")  # Pfadstruktur in Output.txt witd dann relativ zu target_root aufgefasst
        target_folder = (os.path.join(target_root, target_folder))
        # print(target_folder)
        try:
            dummy = (map[filename.rstrip()]["files"])  # Zugriffversuch, um festzustellen, ob es den KEy schon gibt
            # print(filename)
            count_dup +=1
        except KeyError:
            pass
        map[filename.rstrip()] = {"files": [], "folder": target_folder}
    print("Duplikate (Doppelte Dateinamen ungeachtet vom Pfad) in output.txt: " + str(count_dup))

# Einlesen der Pfade, die im Backupverzeichnis vorhanden sind, aus search.txt
with open(indexfilename, encoding="utf8") as f2:
    for backup_file in f2.readlines():
        try:
            map[os.path.basename(backup_file).rstrip()]["files"].append(backup_file.rstrip())
        except KeyError:  # datei aus search.txt nicht in output.txt vorhanden
            pass

#
makedirs_batch_file = open("01_Ordner_anlegen.bat", "w")  # w für overwrite

no_dup = 0  # Anzahl Dateien mit genau einem Eintrag
single_match_batch_copy_file = open("02_Dateien_kopieren_SingleMatch.bat", "w", encoding="utf8")

n_duplicates = 0  # Anzahl an Einträgen, die nicht eindeutig sind
n_dup_files = 0  # Anzahl an betroffenen Dateien
duplicates_batch_copy_file = open("03_Dateien_kopieren_Duplikate.bat", "w", encoding="utf8")

n_not_found = 0  # Anzahl nicht gefundene Dateien
not_found_list_file = open("04_NotFoundInIndex.txt", "w", encoding="utf8")

# Map durchgehen
for filename_entry in map:
    target = os.path.join(map[filename_entry]["folder"], filename_entry)
    # makedirs_batch_file.write("mkdir \"" + os.path.dirname(target) + "\"" + "\n")
    # # os.makedirs(os.path.dirname(target), exist_ok=True)  # anlegen der Ordner in python
    count = 1
    if len(map[filename_entry]["files"]) == 0:
        n_not_found += 1
        not_found_list_file.write(filename_entry + "\n")
    if len(map[filename_entry]["files"]) == 1:
        no_dup += 1
        source = map[filename_entry]["files"][0]  # erster und einziger gefundener Eintrag
        makedirs_batch_file.write("mkdir \"" + os.path.dirname(target) + "\"" + "\n")
        single_match_batch_copy_file.write("copy \"" + source + "\" \"" + target + "\"" + "\n")
        # shutil.copy(source, target)  # Kopieren mit Python
    if len(map[filename_entry]["files"]) > 1:
        n_dup_files += 1
        for count, source in enumerate(map[filename_entry]["files"]):
            if count == 1:
                target_new = target
                pass
            else:
                name_no_extension = pathlib.Path(target).stem
                extension = pathlib.Path(target).suffix
                target_new = os.path.dirname(target) + name_no_extension + "_" + str(count) + extension
                # print(target_new)
                # print("Duplicate at " + target)
                n_duplicates += 1
            target_new = os.path.relpath(target_new, os.path.abspath(target_root))
            target_new = (os.path.join(target_dopplungen, target_new))
            makedirs_batch_file.write("mkdir \"" + os.path.dirname(target_new) + "\"" + "\n")
            duplicates_batch_copy_file.write("copy \"" + source + "\" \"" + target_new + "\"" + "\n")
            # shutil.copy(source, target)
    pass

# Dateien schließen
makedirs_batch_file.close()
single_match_batch_copy_file.close()
duplicates_batch_copy_file.close()


print("Anzahl an Einträgen, die nicht eindeutig sind (Dateiname aus output.txt mehrfach in search.txt): " + str(n_duplicates))
print("Anzahl betroffene Dateinamen in output.txt: " + str(n_dup_files))
print("Anzahl eindeutige Einträge: " + str(no_dup))
print("Anzahl nicht gefundene Dateien: " + str(n_not_found))
 
  • Gefällt mir
Reaktionen: Marvolo und s1ave77
Vielen Dank, euch zwei!
Kopieren tut es jetzt allerdings (noch) nicht?

Zumindest zeigt es mir in CMD nach Ausführen der py-Datei nun lediglich nur ein paar Anzahlen gefundener Einträge in output und search an, sonst tut sich aber nichts - auch nicht im Gefunden-Ordner.

1719256873991.png

Ergänzung ()

Bezüglich Zeile 37 und " # datei aus search.txt nicht in output.txt vorhanden"

eventuell verstehe ich es auch nur falsch, aber es sollte eigentlich anders herum sein: der Backup-Medienordner ist nicht vollständig und deckt mit großer Sicherheit nicht alle von WhatsApp verlangten Pfade/Dateien ab, weil leider über die Jahre ein paar Dateien unwiderruflich verloren gegangen sind.

Es sollten also optimalerweise anhand der geforderten Einträge der (jeweiligen) Output-Datei aufgelistet werden, welche Dateien das Backup-Archiv leider nicht mehr enthält.
Anhand dieses Wissens kann ich dann ggf. noch auf anderen PCs bzw. anderen Verzeichnissen gezielt nach nur noch diesen fehlenden Dateien (die dann quasi eine neue Output-datei ergeben) suchen und brauche die ganze Zeremonie dort dann nicht nochmal komplett von Vorne laufen lassen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: s1ave77
Das Pythonskript in der Form kopiert keine Dateien, legt dir aber die drei Batchdateien an (bzw überschreibt vorhandene), in denen dann Kopierbefehle stehen. So kann man vorher nochmal gucken.
Alternativ kann man die shutil bzw os.makedir wieder Einkommentieren. Es fehlt allerdings noch ein solcher Kommentar nach Zeile 83.
Die Raute ist das Kommentarzeichen in Python.

Zum Kopieren dann also einfach die Batchdateien ausführen. (Am besten aus Powershell raus, dann sollte auch die UTF-8 Kodierung von Haus aus aktiv sein.)

Zeile 37 bzw 38 greift nur dann, wenn dieser Fall vorkommt. Und Zeile 38 sagt, überspringe diese Datei. Ich meine, es gab in deiner letzten Datei (viele) solche Fälle. Bin aber nicht sicher.
Könnte man auch in eine Liste schreiben, so man denn wöllte. ^^
 
  • Gefällt mir
Reaktionen: s1ave77 und Marvolo
Super!

Ich hatte das nicht gesehen, dass es im Hintergrund Batch-Dateien erzeugt hatte, weil ich so darauf gewartet hatte, dass es direkt kopiert. Habe die Dateien nun gefunden und laufen lassen. Die gewünschten Dateien waren innerhalb von 5 Sekunden kopiert.

Liegt aber definitiv auch daran, dass ich nun eine Output-Datei genommen habe, die weniger Einträge enthält und von denen im großen Backup-Ordner auch leider nur ein Bruchteil noch vorhanden ist.

Aber es läuft zumindest jetzt mal.

PS: Eine Rückfrage noch zu den Doppelungen:
Sehe ich es richtig, dass es als Doppelungen ALLE Dateien zählt, die doppelt vorkommen, also auch die allererste?

Ich war nämlich gerade etwas verwirrt, dass der eigentliche WhatsApp Images Ordner vergleichsweise klein mit wenigen Dateien ausfällt, bis ich dann gesehen habe, dass der Großteil dann in Doppelungen liegt. Vermutlich kopiert es dort nicht nur die tatsächlichen Doppelungen (also die n+1, n+2, n+3te Kopie eines Originals), sondern auch das Original selbst?
 
Zuletzt bearbeitet:
Genau,
Marvolo schrieb:
kopiert es dort nicht nur die tatsächlichen Doppelungen (also die n+1, n+2, n+3te Kopie eines Originals), sondern auch das Original selbst?
Ja, alle Dateinamen, die mehrfach gefunden wurden, landen in dem Unterordner "Dopplungen." Kann man auch ändern, dann muss man halt bei Zeile 72 Ordnererstellung und Kopiervorgang einfügen und Zeilen 81 bis 95 in den else-Zweig schieben.

Wenn das wirklich alles verschiedene Kopien derselben Datei sind, dann klingt das auch sinnvoll.
Wenn es unterschiedliche Dateien sind, die nur denselben Namen tragen, dann müsste man sie ja ohnehin alle überprüfen.

Wie so oft, machen kann man viel, man muss aber halt wissen, was man machen will.
 
  • Gefällt mir
Reaktionen: Maviapril2
simpsonsfan schrieb:
Wenn das wirklich alles verschiedene Kopien derselben Datei sind, dann klingt das auch sinnvoll.
Wenn es unterschiedliche Dateien sind, die nur denselben Namen tragen, dann müsste man sie ja ohnehin alle überprüfen.

Genau das ist leider bei einigen (Gott sei Dank aber wenigen) Dateien der Fall. Keine Ahnung, wie das passieren konnte, denn WA ist da eigentlich mit seiner Nomenklatur relativ strikt. Da bleibt jetzt nur, das anhand vom Chatkontext irgendwie zu rekonstruieren, welche der Dateien da nun passen könnte.
 
Also es funktioniert alles, wie es soll und auch sehr zügig und schnell.
Die etwas sonderbare Namensgebung aller Dateien im Dopplungen-Ordner ist nicht weiter schlimm, die kann ich dann auch händisch korrigieren bzw. in die entsprechenden Ordner zurückschieben, wo sie hingehören, vor allem, da es ja eh nur wenige Dopplungen betrifft, die ich überhaupt brauche.

Allerdings ist mir eine Kuriosität aufgefallen:

Es finden sich teilweise Dateien im Gefunden-Ordner, die so in der Form aber nicht in der jeweiligen Output-Datei gelistet sind.

Hier z.B. mal die entsprechende output-Datei - diese enthält keinen Eintrag über einen 10. März 2020. Allerdings befinden sich sowohl in der dann erzeugten BAT-Datei als auch im gefunden-Ordner dann Dateien bzw. Einträge für einen 10. März 2020.

Das sollte so natürlich nicht sein, da es ja streng nur solche Dateien aus dem Pool kopieren soll, die auch in der Output-Datei als Pfad dort abgebildet sind. Sonst habe ich am Ende eine Menge überflüssiger Dateien, die aber keine Zuweisung im Sinne eines Medienpfads in WhatsApp haben.

Im Anhang output.txt und die dazugehörige, vom Script erstellte BAT-Datei (in txt-Endung), die ganz unten als letzte Einträge 10. März 2020 aufweisen, die so in der output-Datei aber nicht vorkommen.
 

Anhänge

Zuletzt bearbeitet:
Bei der Nummerierung ist ein Pfadtrenner verloren gegangen. Deswegen waren die Dateinamen bei den Dopplungen bspw. SentIMG-20200310-WA0000_4.jpg statt Sent\IMG-20200310-WA0000_4.jpg.
Ich nehme an, das wirst du gemeint haben, denn Zeile 1613 von deiner output.txt ist ja Media/WhatsApp Images/Sent/IMG-20200310-WA0000.jpg

Aktuell (wie du siehst, ich habe die erste Batch umbenannt und jeweils eine der mehrfach gefundenen Dateien dazugenommen) :
Python:
import os
import pathlib
import shutil


target_root = os.path.abspath("F:/gefunden")
target_dopplungen = os.path.abspath("F:/gefunden/Dopplungen")

outputfilename = "output.txt"
indexfilename = "search.txt"


map = {}
# Einlesen der Pfade (die WhatsApp möchte) aus output.txt
with open(outputfilename, encoding="utf8") as f1:
    count_dup = 0  # Duplikatzähler für Dateinamen in output.txt
    for db_file in f1.readlines():
        # print(db_file)
        path, filename = os.path.split(db_file)
        target_folder = os.path.relpath(path, "")  # Pfadstruktur in Output.txt witd dann relativ zu target_root aufgefasst
        target_folder = (os.path.join(target_root, target_folder))
        # print(target_folder)
        try:
            dummy = (map[filename.rstrip()]["files"])  # Zugriffversuch, um festzustellen, ob es den KEy schon gibt
            # print(filename)
            count_dup +=1
        except KeyError:
            pass
        map[filename.rstrip()] = {"files": [], "folder": target_folder}
    print("Duplikate (Doppelte Dateinamen ungeachtet vom Pfad) in output.txt: " + str(count_dup))

# Einlesen der Pfade, die im Backupverzeichnis vorhanden sind, aus search.txt
with open(indexfilename, encoding="utf8") as f2:
    for backup_file in f2.readlines():
        try:
            map[os.path.basename(backup_file).rstrip()]["files"].append(backup_file.rstrip())
        except KeyError:  # datei aus search.txt nicht in output.txt vorhanden
            pass

#
makedirs_batch_file = open("01_Ordner_anlegen.bat", "w")  # w für overwrite

no_dup = 0  # Anzahl Dateien mit genau einem Eintrag
# single_match_batch_copy_file = open("02_Dateien_kopieren_SingleMatch.bat", "w", encoding="utf8")
first_match_batch_copy_file = open("02_Dateien_kopieren_FirstMatch.bat", "w", encoding="utf8")

n_duplicates = 0  # Anzahl an Einträgen, die nicht eindeutig sind
n_dup_files = 0  # Anzahl an betroffenen Dateien
duplicates_batch_copy_file = open("03_Dateien_kopieren_Duplikate.bat", "w", encoding="utf8")

n_not_found = 0  # Anzahl nicht gefundene Dateien
not_found_list_file = open("04_NotFoundInIndex.txt", "w", encoding="utf8")

# Map durchgehen
for filename_entry in map:
    target = os.path.join(map[filename_entry]["folder"], filename_entry)
    # makedirs_batch_file.write("mkdir \"" + os.path.dirname(target) + "\"" + "\n")
    # # os.makedirs(os.path.dirname(target), exist_ok=True)  # anlegen der Ordner in python
    count = 1
    if len(map[filename_entry]["files"]) == 0:
        n_not_found += 1
        not_found_list_file.write(filename_entry + "\n")
    if len(map[filename_entry]["files"]) == 1:
        no_dup += 1
        source = map[filename_entry]["files"][0]  # erster und einziger gefundener Eintrag
        makedirs_batch_file.write("mkdir \"" + os.path.dirname(target) + "\"" + "\n")
        first_match_batch_copy_file.write("copy \"" + source + "\" \"" + target + "\"" + "\n")
        # shutil.copy(source, target)  # Kopieren mit Python
    if len(map[filename_entry]["files"]) > 1:
        n_dup_files += 1
        for count, source in enumerate(map[filename_entry]["files"]):
            if count == 1:
                makedirs_batch_file.write("mkdir \"" + os.path.dirname(target) + "\"" + "\n")
                first_match_batch_copy_file.write("copy \"" + source + "\" \"" + target + "\"" + "\n")
                target_new = target
                pass
            else:
                name_no_extension = pathlib.Path(target).stem
                extension = pathlib.Path(target).suffix
                target_new = os.path.join(os.path.dirname(target), name_no_extension + "_" + str(count) + extension)
                n_duplicates += 1
            target_new = os.path.relpath(target_new, os.path.abspath(target_root))
            target_new = (os.path.join(target_dopplungen, target_new))
            makedirs_batch_file.write("mkdir \"" + os.path.dirname(target_new) + "\"" + "\n")
            duplicates_batch_copy_file.write("copy \"" + source + "\" \"" + target_new + "\"" + "\n")
            # shutil.copy(source, target)
    pass

# Dateien schließen
makedirs_batch_file.close()
first_match_batch_copy_file.close()
duplicates_batch_copy_file.close()


print("Anzahl an Einträgen, die nicht eindeutig sind (Dateiname aus output.txt mehrfach in search.txt): " + str(n_duplicates))
print("Anzahl betroffene Dateinamen in output.txt: " + str(n_dup_files))
print("Anzahl eindeutige Einträge: " + str(no_dup))
print("Anzahl nicht gefundene Dateien: " + str(n_not_found))
 
  • Gefällt mir
Reaktionen: s1ave77 und Marvolo
Eigentlich meinte ich nicht den verloren gegangenen Pfadtrenner und die merkwürdige Nomenklatur im Dateinamen. Aber das, was ich ursprünglich meinte, kann ich jetzt selbst gerade nicht mehr reproduzieren bzw. finden. Ich ging irgendwie davon aus, dass 20200310-WA0000.jpg gar nicht vorhanden sei.

EDIT:
Aber vermutlich weiß ich jetzt doch wieder, was mich verwirrt: Die Pfade in der erzeugten Batch-Datei. Der Quellordner (also der Medien-Pool) beherbigt die gesuchte Datei in einem offenbar anderen Verzeichnis als im Zielordner. Die Unterscheidung zwischen gesendet oder nicht gesendet ist nämlich schon wichtig. Oder übersehe ich hier irgendwas Grundlegendes?

1719335375111.png


Also wenn eine Datei im Quellordner nicht im Gesendet-Ordner liegt, sondern im Empfangen-Ordner (WhatsApp Images\), dann sollte die kopierte Datei im Zielordner dies natürlich ebenso tun, sonst zerhackt es die ganzen Zuweisungen und WA findet die Dateien dann nicht.

Aber wie gesagt, ansonsten läuft es richtig flott und macht genau das, was es soll. Vielen Dank jedenfalls.
 

Ähnliche Themen

Zurück
Oben