Batch Windows-Dateiensuche möglich?

Hallo,

ich nochmal.
Im Anhang habe ich zwei Textdateien. Einmal Output.txt und einmal db0.txt.

Ich möchte beide auf identische Einträge (= identischer Dateiname) überprüfen. Wie mache ich das am besten? Gibt's dafür vielleicht auch ein einfaches, simples Script?

Mögliche Übereinstimmungen können z.B. grafisch markiert werden (Zeile/Text in "fett" oder anderer Schriftfarbe) oder auch in einem neuen Dokument aufgelistet werden, falls dies möglich ist.

Vielen Dank

PS:
ChatGPT spuckt das hier aus. Ist das brauchbar?

Python:
def extract_filenames(file_path):
    """
    Liest eine Datei ein und extrahiert die Dateinamen aus den Pfaden.
    """
    with open(file_path, 'r') as file:
        lines = file.readlines()
        filenames = [line.strip().split('/')[-1] for line in lines if line.strip()]
    return filenames

def find_identical_filenames(file1_path, file2_path):
    """
    Findet identische Dateinamen in zwei TXT-Dateien.
    """
    filenames1 = extract_filenames(file1_path)
    filenames2 = extract_filenames(file2_path)
    
    identical_filenames = set(filenames1).intersection(filenames2)
    return identical_filenames

# Beispiel: Dateipfade zu den TXT-Dateien
file1_path = 'pfad/zu/deiner/ersten_datei.txt'
file2_path = 'pfad/zu/deiner/zweiten_datei.txt'

identical_filenames = find_identical_filenames(file1_path, file2_path)

print("Identische Dateinamen:")
for filename in identical_filenames:
    print(filename)
 

Anhänge

Zuletzt bearbeitet:
Marvolo schrieb:
ChatGPT spuckt das hier aus. Ist das brauchbar?
Prinzipiell ja. Außer, dass meiner persönlichen Meinung nach Python-Funktionen mit Type-Hints versehen gehören (tut aber hier nichts zur Sache bzw. ist für dich absolut irrelevant) und dass man nicht zwingend "/" als Pfadtrenner vorgeben sollte, falls man plant, das auch auf Windows-Pfade mit "\" zu verwenden.

Hast du das Skript ausgeführt? Sollte dir ja die doppelten Dateinamen in der Konsole ausgeben.
Du kannst beim Ausführen statt python skriptname.py auch wieder python skriptname.py > ausgabe.txt verwenden, um die Ausgabe in die Datei ausgabe.txt zu leiten.
Willst du denn bewusst nur den Dateinamen prüfen? Du könntest ja auch auf Gleichheit des kompletten Pfades prüfen. Ich frage, weil du ja im einen Fall wissen wolltest, ob eine Datei im Ordner "Sent" ist.

P.S. Der Thread hat schon 6 Seiten. Diese Frage gehört zwar thematisch dazu, ist aber wieder neu. Evtl. wäre es übersichtlicher, wenn das ein extra Thread wäre. Weiß aber nicht, wie die Moderation dazu steht.
 
simpsonsfan schrieb:
Hast du das Skript ausgeführt?
Ich habe es probiert, aber dann kam eine Fehlermeldung bezüglich

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated

Daraufhin habe ich dies so ChatGPT gesagt und es hat folgende Erklärung und Anpassung am Script vorgenommen:

Der Fehler SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated tritt normalerweise auf, wenn in einem String ein Backslash \ verwendet wird, der als Escape-Zeichen interpretiert wird. Dies ist häufig der Fall bei Windows-Dateipfaden.

Um dies zu vermeiden, kannst du entweder rohe Strings verwenden (mit einem vorangestellten r) oder doppelte Backslashes verwenden. Hier sind die beiden Möglichkeiten:

Python:
def extract_filenames(file_path):
    """
    Liest eine Datei ein und extrahiert die Dateinamen aus den Pfaden.
    """
    with open(file_path, 'r') as file:
        lines = file.readlines()
        filenames = [line.strip().split('/')[-1] for line in lines if line.strip()]
    return filenames

def find_identical_filenames(file1_path, file2_path):
    """
    Findet identische Dateinamen in zwei TXT-Dateien.
    """
    filenames1 = extract_filenames(file1_path)
    filenames2 = extract_filenames(file2_path)
    
    identical_filenames = set(filenames1).intersection(filenames2)
    return identical_filenames

# Beispiel: Dateipfade zu den TXT-Dateien
file1_path = r'pfad\zu\deiner\ersten_datei.txt'
file2_path = r'pfad\zu\deiner\zweiten_datei.txt'

identical_filenames = find_identical_filenames(file1_path, file2_path)

print("Identische Dateinamen:")
for filename in identical_filenames:
    print(filename)

Danach kam dann aber nochmal eine Fehlermeldung, sodass es mir zu blöd wurde und ich habe ChatGPT gefragt, ob ich ihm diese zwei TXT-Dateien nicht direkt einfach geben kann und es überprüft dann selber auf identische Dateinamen.

Daraufhin:

Ich werde die beiden Dateien auf identische Dateinamen in den Pfaden überprüfen. Hier ist das Python-Skript, das ich verwenden werde:

Python:
def extract_filenames(file_path):
    """
    Liest eine Datei ein und extrahiert die Dateinamen aus den Pfaden.
    """
    with open(file_path, 'r') as file:
        lines = file.readlines()
        filenames = [line.strip().split('/')[-1] for line in lines if line.strip()]
    return filenames

def find_identical_filenames(file1_path, file2_path):
    """
    Findet identische Dateinamen in zwei TXT-Dateien.
    """
    filenames1 = extract_filenames(file1_path)
    filenames2 = extract_filenames(file2_path)
    
    identical_filenames = set(filenames1).intersection(filenames2)
    return identical_filenames

# Dateipfade zu den hochgeladenen TXT-Dateien
file1_path = '/mnt/data/db0.txt'
file2_path = '/mnt/data/output.txt'

identical_filenames = find_identical_filenames(file1_path, file2_path)

print("Identische Dateinamen:")
for filename in identical_filenames:
    print(filename)

Danach fing es an, mir die doppelten Dateinamen alle untereinander aufzulisten, woraufhin ich es gebeten habe, mir die gefundenen Dateinamen bitte lieber als eigene TXT-Datei zum Download zur Verfügung zu stellen, was es dann auch gemacht hat.

Ich bin ganz baff, wieviel dieses Ding kann. Man kann mit dem reden, wie mit einem Menschen.

simpsonsfan schrieb:
P.S. Der Thread hat schon 6 Seiten. Diese Frage gehört zwar thematisch dazu, ist aber wieder neu. Evtl. wäre es übersichtlicher, wenn das ein extra Thread wäre. Weiß aber nicht, wie die Moderation dazu steht.

Streng genommen hat auch dieses Vorhaben noch mit dem Ausgangsthema zu tun. Da ich Chats aus verschiedenen WhatsApp-Datenbanken bzw. aus einer alten Handynummer mit meiner nun neuen vereinen will, muss ich überprüfen, welche Medieneinträge des Chats unter der alten WhatsApp-Nummer mit den Medieneinträgen meiner neuen WhatsApp-Nummer ggf. kollidieren. Normalerweise sieht WhatsApp nicht vor, dass man derart tiefgreifende Veränderungen vornimmt und Chats von völlig fremden Nummern auf seinen eigenen Account schiebt, deshalb gibt's da in der Datenbank auch sehr viel zu beachten, damit nachher nichts mit bereits bestehenden Einträgen kollidiert.

simpsonsfan schrieb:
Willst du denn bewusst nur den Dateinamen prüfen? Du könntest ja auch auf Gleichheit des kompletten Pfades prüfen. Ich frage, weil du ja im einen Fall wissen wolltest, ob eine Datei im Ordner "Sent" ist.

Ne, das oben im Screenshot genannte Problem hat hiermit nix zu tun. Das verwirrt mich aber nach wie vor - warum in der Batch-Datei im Quellordner eine Datei nicht im SENT-Ordner ist, aber im Zielordner dann schon. Gibt's da eine Erklärung für?

Auch noch eine Frage zur Namensettiketierung: liege ich richtig, dass doppelte Dateien immer mit _0 / 1 / 2 / 3 enden, je nach dem, wie viele dieser Dopplungen vorhanden sind?

Um die alle rauszulöschen, habe ich in der Windows-Suche dann einfach nach "_0" "_1" "_2" etc gesucht und es zeigte dann nur jene Dateien mit Unterstrich, also Dopplungen.

Jetzt gibt es aber einige wenige Dateien, von denen anscheinend kein "Original" existiert. Sprich, sie haben alle bereits einen Unterstrich im Dateinamen, scheinen also Dopplungen zu sein, aber ein Orignal (ohne Unterstrich) finde ich nicht.

Kopiert das Script auch wirklich streng nach jeweiligen Ordnern? Also Images zu Images, Sent zu Sent, Audio zu Audio, etc? Der Screenshot oben wie gesagt hat mich etwas verwirrt.
 
Marvolo schrieb:
Ich möchte beide auf identische Einträge (= identischer Dateiname) überprüfen.
Option ohne coden:
beide Dateien in je eine Spalte in Excel kopieren.
Die Formel
Code:
=IF(COUNTIF(A:A, B1)>0, "Gefunden", "Nicht gefunden")
gibt “Gefunden” zurück, wenn der Text in Zelle B1 in Spalte A gefunden wird, und “Nicht gefunden”, wenn .... Man kann diese Formel nach unten ziehen, um sie auf alle Zellen in Spalte B anzuwenden.
Google Sheets wird sicherlich was adäquates anbieten.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Marvolo
Danke, @Micke

Aber ChatGPT hatte es ja dann bereits für mich gemacht - dem kann man offenbar einfach die TXT-Dateien geben und es analysiert die selbstständig. Leider ist die Abfrage auf 2 beschränkt, wenn man nicht die kostenpflichtige Premium-Version holen will. Also leider auf Dauer für mich nicht praktikabel.

@simpsonsfan

Mir ist noch ein kleiner Fehler beim aktuellen Script aufgefallen, als ich gerade die gefundenen Dateien aufs Handy kopiert habe und mich dann ordentlich gewundert habe, dass manche Mediendateien an völlig falschen Orten im Chat auftauchen. Zu tun hat dieses Problem nach meiner Zurückverfolgung von Pfad- und Dateinamen in der Datenbank - welche aber alle korrekt zu sein scheinen - nun mit den doppelten Dateien.

Zwar findet dein Script Doppelte Dateien und numeriert die dann auch jeweils mit _0 _1 _2 etc durch - allerdings listet es nicht alle doppelten Dateien, sondern nur jene, die denselben Inhalt (evtl. dieselbe Größe, denn das Script kann ein Bild ja nicht anschauen) haben.

Das führt dann zu sowas hier:

1719486515163.png


Und genau so sollte es ja auch sein. ABER...

Jetzt gibt es halt leider noch eine vom Dateinamen identische Datei (IMG-20191024-WA0004.jpg), die aber vom Bildinhalt komplett anders ist und von der es dann u.U. auch wieder Dopplungen gibt. Diese wäre in diesem Fall aber die richtige für den Chat gewesen und nicht die Katze im Gras:

1719486750538.png


Diese Datei listet das Script aus irgendwelchen Gründen aber im "gefunden"-Ordner gar nicht erst auf, sondern nur die oberen mit der Katze.

Kann es sein, dass das Script automatisch aufhört, nach weiteren Dopplungen zu suchen, wenn es bereits eine Datei mit Dopplungen gefunden hat, sodass dann andere Dateien mit demselben Dateinamen aber anderem Bildinhalt dann nicht mehr erfasst werden? Nimmt es vielleicht nur jene Dateien als "Dopplungen", die zur Originaldatei dieselbe Größe und Eigenschaften haben und markiert diese dann als "doppelt"?

Falls man dieses Problem noch irgendwie lösen könnte, wäre das gut, denn momentan habe ich für die meisten gesuchten Medien leider immer die falsche Datei, bis ich jetzt mal händisch im Pool-Ordner nachrecherchiert habe und dann gemerkt habe, da gibt's ja noch ne andere Datei mit selbem Namen, aber anderem Inhalt, aber die wären dann die richtigen gewesen.

Klar ist natürlich, dass das Script nicht wissen kann, welche Datei für mich nun die richtige ist, d.h. in diesen Fällen muss ich IMMER manuell kopieren. Aber genau deswegen soll es ja die Dopplungen geben, damit ich anhand aller Dopplungen sehen kann, ob es Dateien mit selbem Namen, aber unterschiedlichen Inhalten (nicht einfach nur Kopien der selben Datei mit selbem Inhalt) gibt. Die Kopien mit selbem Inhalt lösche ich direkt nach Beendigung des Scripts wieder raus. Interessieren tun mich nur die Dopplungen mit selbem Dateinamen, aber unterschiedlichem Dateiinhalt.
 
Zuletzt bearbeitet:
Marvolo schrieb:
Aber ChatGPT hatte es ja dann bereits für mich gemacht - dem kann man offenbar einfach die TXT-Dateien geben und es analysiert die selbstständig.
stimmt die Option gibt's ja auch, umso besser 🙂
 
Marvolo schrieb:
Auch noch eine Frage zur Namensettiketierung: liege ich richtig, dass doppelte Dateien immer mit _0 / 1 / 2 / 3 enden, je nach dem, wie viele dieser Dopplungen vorhanden sind?

Um die alle rauszulöschen, habe ich in der Windows-Suche dann einfach nach "_0" "_1" "_2" etc gesucht und es zeigte dann nur jene Dateien mit Unterstrich, also Dopplungen.

Jetzt gibt es aber einige wenige Dateien, von denen anscheinend kein "Original" existiert. Sprich, sie haben alle bereits einen Unterstrich im Dateinamen, scheinen also Dopplungen zu sein, aber ein Orignal (ohne Unterstrich) finde ich nicht.

Kopiert das Script auch wirklich streng nach jeweiligen Ordnern? Also Images zu Images, Sent zu Sent, Audio zu Audio, etc? Der Screenshot oben wie gesagt hat mich etwas verwirrt.
Da sind ein paar verschiedene Skriptverisonen hier im Thread, in denen sich die Benamung entsprechend dem, was du in der Zwischenzeit geschrieben hattest, geändert hat. Die Dateien werden im aktuellsten Skript alle in den Ordner "Dopplungen" kopiert und dort mit "_0", "" (also nichts beim zweiten - das ist ein Fehler), "_2", "_3", ... durchnummeriert.
Bei der Datei "IMG-20191024-WA0004.jpg" sehe ich bspw. fünf Einträge, u.a.
copy "f:\medien\Okt 2020\WhatsApp Images\IMG-20191024-WA0004.jpg" "F:\gefunden\Dopplungen\Media\WhatsApp Images\IMG-20191024-WA0004_4.jpg", die bei dir zu fehlen scheint.
Marvolo schrieb:
Zwar findet dein Script Doppelte Dateien und numeriert die dann auch jeweils mit _0 _1 _2 etc durch - allerdings listet es nicht alle doppelten Dateien, sondern nur jene, die denselben Inhalt (evtl. dieselbe Größe, denn das Script kann ein Bild ja nicht anschauen) haben.
Marvolo schrieb:
Kann es sein, dass das Script automatisch aufhört, nach weiteren Dopplungen zu suchen, wenn es bereits eine Datei mit Dopplungen gefunden hat, sodass dann andere Dateien mit demselben Dateinamen aber anderem Bildinhalt dann nicht mehr erfasst werden? Nimmt es vielleicht nur jene Dateien als "Dopplungen", die zur Originaldatei dieselbe Größe und Eigenschaften haben und markiert diese dann als "doppelt"?
Doch, es sollte an für sich alle Dateien mit diesem Dateinamen auflisten bzw. dann in der Batch kopieren. Es wird auch nur nach dem Dateinamen geschaut, nicht nach Inhalt oder Größe (was aber möglich wäre.)
Das aktuelle Skript spuckt ja drei .bat-Dateien aus:
  1. Anlegen von Ordnern (und zwar einmal in "F:\gefunden\Media\" und einmal in "F:\gefunden\DopplungenMedia\"
  2. Kopieren von
    1. denjenigen Dateien, bei denen es genau einen Datei mit dem Namen gefunden hat und
    2. der jeweils ersten gefundenen Datei mit dem Namen bei den Dateien, bei denen es den Namen mehrfach gefunden hat
  3. Kopieren aller Dateien, deren Dateinamen mehr als einmal vorkommen (und zwar in den Ordner Dopplungen)
Zudem kommen manche Dateinamen in output.txt mehrfach vor und manche Dateinamen wurden in der search.txt (dem Backupordner) nicht gefunden. Ich habe noch nicht überprüft, ob es bei den doppelten Dateinamen in output.txt evtl. so ist, dass eine Datei in Sent ist und eine nicht.

Marvolo schrieb:
Ne, das oben im Screenshot genannte Problem hat hiermit nix zu tun. Das verwirrt mich aber nach wie vor - warum in der Batch-Datei im Quellordner eine Datei nicht im SENT-Ordner ist, aber im Zielordner dann schon. Gibt's da eine Erklärung für?
Ja, die Erklärung gibt es. Das Skript von mir schaut nur nach dem Dateinamen, nicht nach Ordnern. So hatte ich die Anforderung verstanden. Die Logik wär sogar tendenziell einfacher, wenn man die Pfade mitnimmt. D.h. das wurde in dem Skript extra entfernt, weil du als Anforderung genannt hast, dass anhand von Dateinamen, ohne Berücksichtigung der Pfade gesucht werden soll (Wurde sicher irgendwo im Thread in der Diskussion mit @mae1cum77 mal korrigiert, aber hab ich dann eben übersehen.)

Wenn deine Anforderung übrigens eigentlich nicht ist, Dateinamen abzugleichen, sondern stattdessen Dateien mit selbem Dateiinhalt zu finden (weil es exakte Dateikopien sind (also nicht Bild im Bildbetrachter aufgemacht und neu abgespeichert), dann würde man nochmals anders an die Sache rangehen.
Daher braucht man klare Anforderungen.
 
  • Gefällt mir
Reaktionen: Marvolo
@simpsonsfan

Vielen lieben Dank für die ausführliche Erklärungen. Ja, es kann gut sein, dass ich mich teilweise etwas missverständlich ausgedrückt hatte und dass sich die Anforderungen auch vielleicht etwas geändert haben mit der Zeit bzw. ich nicht immer konkret vermitteln konnte, was ich genau meinte.

Mit dem aktuellsten / neusten Script sind wir aber fast am Ziel, wie es scheint. Es tut alles, was es soll - nur dass es nun anscheinend nicht alle Dateien mit dem selben Dateinamen findet, wie oben beschrieben für die Datei IMG-20191024-WA0004.jpg.

Also, ich präzisiere noch einmal, was genau passieren müsste mittels Script (was zu 99% schon der Fall ist, daher sagte ich ja, wir sind eigentlich so gut wie am Ziel, wie es scheint):

1. Suche alle anhand der Output.txt gelisteten Pfade nach den dort gelisteten Dateien (die sollten alle jeweils nur 1x vorkommen, denn die Output.txt ist direkt der Datenbank entnommen und die sollte keine doppelten Einträge listen) im Medien-Ordner, wo alle Medien kreuz und quer und gerne auch mal in mehrfacher Ausführung (Backup-Kopien) rumfahren. Der Medien-Ordner sollte durch die search.txt-Datei abgebildet sein - jedenfalls verwendete ich für die Indexierung das Script von @mae1cum77, was in seiner neusten Form ja auch nur das tut - alle Dateien indizieren und in die search.txt schreiben.

2. Aufgrund der Mehrfach-Kopien/Backups gibt es von manchen Dateien mehr als eine identische Version (= Dopplungen). Inhaltsgleiche Dopplungen sind für mich nicht wirklich von Bedeutung, denn da reicht das Original.

3. Wichtig sind identische Dateinamen, die aber vom Inhalt her verschieden sind (wie oben im Screenshot mit der IMG-20191024-Datei), denn anhand von diesen Dateien muss ich dann leider manuell überprüfen, welche denn nun die richtige ist. Dies geht leider nicht automatisiert, da das Script gar nicht wissen KANN, welche der beiden identischen Dateiennamen (aber unterschiedlicher Inhalt) nun benötigt wird (oder kann es das, wenn man es irgendwie mit der WA-Datenbank vertraut macht? Aber selbst dort sind ja eigentlich nur die jeweiligen Dateipfade + Dateinamen gelistet. Eventuell gleicht WA zusätzlich auch noch Dateigröße und andere Metadaten ab und weiß daher, welche Datei nun die richtige ist, selbst wenn es verschiedene mit identischem Namen gibt).

4. Aus diesem Grund müsste das Script schlichtweg ALLES kopieren, sowohl Dopplungen, die lediglich inhaltsgleiche Kopien der Originaldatei sind (aufgrund verschiedener Backup-Kopien im Medienordner), als auch die für mich wichtigen identischen Dateinamen, aber mit unterschiedlichem Inhalt, denn auf die kommt es letztlich an in diesen manuellen Zweifelsfällen.

5. Wichtig ist ebenfalls, dass die originale Pfadstruktur immer gewahrt wird. Das heißt: befindet sich eine Datei im Quellordner in einem bestimmten Ordner/Verzeichnis (etwa "sent"), dann MUSS das zwingend auch im "gefunden"-Ordner/Zielordner vom Pfad her so sein.

6.) Ich weiß, ich hatte einmal darum gebeten, die Dopplungen der besseren Übersicht halber in einen eigenen Ordner zu packen. Da es aber umso wichtiger ist, dass die originale Pfad-Struktur auch im gefunden-Ordner für jede einzelne Datei beibehalten wird, ist es nicht weiter schlimm, wenn auch alle doppelten Dateien alle zusammen mit allen anderen Dateien im jeweiligen Ordner landen.
Die kann ich dann mittels "_0"-Windows-Suche dann anzeigen und auf einen Schlag löschen lassen.

Zusammengefasst: wichtig wäre, ALLE Dateien zu kopieren, auch bzw. gerade die, die zwar identisch vom Namen sind, aber einen anderen Inhalt haben. Originalpfade sollen so auch im Gefunden-Ordner rekonstruiert und die gefundenen Dateien jeweils dort reinkopiert werden. Dopplungen müssen nicht mehr gesondert in einen Ordner, sondern können zusammen mit ihren Originalen in die jeweilige Ordner, aus denen sie im Quellverzeichnis stammen.

Damit wäre dann alles genauso, wie es sein sollte. Wie gesagt, macht dies das neuste Script auch zu 99% schon bereits so. Wundern tut mich nur, dass es eben diese IMG-20191024-Datei nur einmal gefunden hat, nicht aber als die Datei einen anderen Inhalt hatte.
Ergänzung ()

simpsonsfan schrieb:
Zudem kommen manche Dateinamen in output.txt mehrfach vor

Das verwirrt mich - das dürfte eigentlich so nicht sein, denn das würde bedeuten, dass diese Einträge so auch in der WhatsApp-Datenbank mehrfach vorkommen, was eigentlich nicht sein kann. WhatsApp listet und nummeriert streng nach Tag, Monat, Jahr. Die erste an einem Tag gesendete oder empfangene Datei bekommt das Datum des jeweiligen Tags und die Endung WA0000
Alle weiteren an diesem Tag gesendeten oder empfangenen Dateien werden ab da von hinten durchnummeriert: 0001, 0002, 0003.

Von daher dürfte eigentlich von ein und der selben Datei nie ein mehrfacher Eintrag vorliegen, sonst würde das zu Kollisionen führen.
 
Zuletzt bearbeitet:
Ich muss mir das evtl. am Wochenende mal in Ruhe durchlesen und kann dann evtl. noch mal was dazu sagen. Vielleicht fehlt ja dann nur ne Kleinigkeit. Vorab nur mal so viel:
  • Punkt 4 verstehe ich nicht.
Marvolo schrieb:
das dürfte eigentlich so nicht sein
  • Soweit ich das sehe, ist es ist aber so. Bspw. lauten die Zeilen 1320 und 9503 der von dir bereitgestellten output.txt beide jeweils Media/WhatsApp Images/Sent/IMG-20200623-WA0000.jpg. Außer, die wäre bei mir irgendwie durcheinander geraten. Halte ich aber für unwahrscheinlich.
 
So, zwar ist das Wochenende vorbei, aber hier trotzdem mal noch etwas ausführlichere Rückfragen zu #128.

1. Was heißt kreuz und quer? Ist die Struktur unterhalb von "Media", also bspw. "WhatsApp Video" immer vorhanden?
1a. Ist insbesondere die Struktur unterhalb von bspw. "WhatsApp Images" immer vorhanden? Konkret sehe ich dort bspw. Unterordner "Sent" und "Private" in deiner search.txt. Zudem monatsweise Unterordner bei "WhatsApp Voice Notes"

2. Sind die Dopplungen reine Kopien von Dateien? Falls ja, kann man das mittels bspw. diff überprüfen.
2a. Du sprichst von Original. Sind dir bei gleichem Dateiinhalt Dateiattribute (wie bspw. das Windows Erstelldatum-Attribut) wichtig? (Ich vermute nein, also einfach irgendeine der Dateien gewünscht.)

3. Ich denke auch, dass du manuell entscheiden musst.

4. Kann ich, wie bereits erwähnt, nicht nachvollziehen.

5. Siehe 1a, was heißt "originale Pfadstruktur wahren"?
5a. Wohin dürfte eine Datei "f:\medien\Medien Stand 17.06.24\Media\WhatsApp Images\Private\IMG-20220307-WA0001.jpg" hin? Welcher Teil des Pfads müsste beachtet werden.
5b. Wo (in welchen Verzeichnissen) dürfte nach einer "Media/WhatsApp Images/Sent/IMG-20220304-WA0002.jpg" gesucht werden?
5c. Wo (in welchen Verzeichnissen) dürfte nach einer "Media/WhatsApp Images/IMG-20210328-WA0000.jpg" gesucht werden?

6. Wohin sollen doppelte Dateien kopiert werden?
6a. Wie soll das Namenschema für doppelte Dateien aussehen?
6aa. Soll eine Datei den Originalnamen bekommen?
 
  • Gefällt mir
Reaktionen: Marvolo
Ich melde mich morgen ausführlich dazu. Zwischenzeitlich konnte mir ChatGPT etwas aushelfen, aber ein komplettes Search-Tool ist das leider auch nicht und es ist nach wie vor viel manuelle Arbeit damit notwendig bzw hat nur deshalb funktioniert, weil ich den Medienordner dafür sehr spezifisch auf einen bestimmten Unterordner eingeschränkt hatte:


Python:
import os
import shutil

# Funktion zum Einlesen der TXT-Datei und Extrahieren der Dateinamen
def read_txt_file(file_path):
    with open(file_path, 'r') as file:
        lines = file.readlines()
    filenames = [os.path.basename(line.strip()) for line in lines]
    return filenames

# Funktion zum Durchsuchen des Medienordners nach Dateien
def find_files_in_folder(folder_path, filenames):
    found_files = []
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            if file in filenames:
                found_files.append(os.path.join(root, file))
    return found_files

# Funktion zur Erzeugung eines einzigartigen Dateinamens
def get_unique_filename(destination_path):
    base, extension = os.path.splitext(destination_path)
    counter = 0
    new_destination_path = destination_path
    while os.path.exists(new_destination_path):
        counter += 1
        new_destination_path = f"{base}_{counter}{extension}"
    return new_destination_path

# Funktion zum Kopieren gefundener Dateien in den Zielordner mit Ordnerstruktur
def copy_files_to_folder(files, media_folder_path, destination_folder):
    for file in files:
        # Berechne den relativen Pfad der Datei bezogen auf den Medienordner
        relative_path = os.path.relpath(file, media_folder_path)
        # Zielpfad inklusive Ordnerstruktur
        destination_path = os.path.join(destination_folder, relative_path)
        
        # Stelle sicher, dass der Zielordner existiert
        destination_dir = os.path.dirname(destination_path)
        if not os.path.exists(destination_dir):
            os.makedirs(destination_dir)
        
        # Erzeuge einen einzigartigen Dateinamen falls nötig
        unique_destination_path = get_unique_filename(destination_path)
        
        # Kopiere die Datei
        shutil.copy(file, unique_destination_path)

# Hauptprogramm
def main():
    txt_file_path = r'C:\Users\username\Desktop\WA PROJEKT\017xxx90\Merge Chats from Business DB\Steffen\Steffen Chat 3\output.txt'  # Pfad zu deiner TXT-Datei
    media_folder_path = r'F:\Handy-Backups\Handy Backups\015xxx02'  # Pfad zu deinem Medienordner
    destination_folder = r'F:\gefunden'  # Pfad zu deinem Zielordner

    filenames = read_txt_file(txt_file_path)
    found_files = find_files_in_folder(media_folder_path, filenames)
    copy_files_to_folder(found_files, media_folder_path, destination_folder)

    print(f'{len(found_files)} Dateien wurden in den Ordner {destination_folder} kopiert.')

if __name__ == "__main__":
    main()
 
simpsonsfan schrieb:
So, zwar ist das Wochenende vorbei, aber hier trotzdem mal noch etwas ausführlichere Rückfragen zu #128.

1. Was heißt kreuz und quer?

Kreuz und quer bedeutet folgendes:
der Medien-Ordner/Pool besteht aus über den Jahren angesammelten Backups des WhatsApp-Medienordners. Soll heißen: einfach immer mal wieder den gesamten Medien-Ordner vom Handy auf den PC gezogen.
Das hat zur Folge, dass es nicht einen einzigen Medienordner gibt, in dem kumulativ alle neuen Dateien hinzugefügt wurden (so wie es der Fall ist für den WhatsApp-Medienordner auf dem Handy), sondern auf dem PC entstehen somit sehr viele Kopien identischer Dateien, denn jedes einzelne Backup beinhaltet ja nicht nur die neu hinzugefügten Dateien in Relation zum vorherigen Backup, sondern jedes einzelne Backup enthält automatisch immer ALLES, was vorher auch schon da war.

Angenommen, ich mache im Jahr 2020 10 Backups des Medienordners - dann habe ich 10x Medienordner im Medien-Pool-Ordner, von denen insbesondere die älteren Dateien 10x vorhanden sind, da sie in früheren Backups ja auch schon da waren.

So entsteht nun also dieses "kreuz und quer". Ich habe mir bei der schieren Menge an Backups / Daten nicht die Mühe gemacht, nur jeweils die neu-hinzugekommenen Mediendateien kumulativ zu sichern, sondern habe halt der Einfachheit halber immer den gesamten Medienordner vom Handy gezogen.

Daher nun so viele Duplikate derselben Dateien.
simpsonsfan schrieb:
Ist die Struktur unterhalb von "Media", also bspw. "WhatsApp Video" immer vorhanden?

Die Struktur des Medienordners ist immer gleich aufgebaut. Ab dem Ordner "Media" ändert sich unterhalb die Struktur nicht mehr. Oberhalb des Ordners "Media" kann es je nach Speicherort im Medien-Pool variieren.. Daher solche Sachen wie "Backup 2022/Media/etc" oder "Handy-Daten Stand 17.06.20/Media/etc"

Relevant wird es für die Suche also erst ab dem Ordner "Media" und den jeweiligen Unterordnern, die immer dieselbe Struktur haben sollten.

simpsonsfan schrieb:
1a. Ist insbesondere die Struktur unterhalb von bspw. "WhatsApp Images" immer vorhanden? Konkret sehe ich dort bspw. Unterordner "Sent" und "Private" in deiner search.txt. Zudem monatsweise Unterordner bei "WhatsApp Voice Notes"

Auch das muss zwingend immer dieselbe Struktur sein, da WhatsApp sonst die Medien nicht erkennen würde. Die Output.txt ist ja eine 1:1 Kopie der WhatsApp-Datenbank-Tabelle "message_media", die die Pfade zu den Mediendateien in Relation zur jeweils geschriebenen Nachricht (message_row_id) in der Datenbank auflistet.

Ist im Chat also am 05.05.20 um 17:20 Uhr ein Bild von mir versendet worden an den Chatpartner, dann schreibt WhatsApp in der Tabelle "message_media" für genau dieses Datum und Uhrzeit den Pfad zu dieser gesendeten Bilddatei als:

Media/WhatsApp Images/sent/IMG-20200505-WA0000.jpg (0000 falls es die erste versendete oder empfangene Datei an diesem Tag ist, ansonsten wird aufaddiert).

Die physische Bilddatei wird daher im WhatsApp-Medienordner in Media/WhatsApp Images/sent/ gespeichert.
simpsonsfan schrieb:
2. Sind die Dopplungen reine Kopien von Dateien?

Siehe oben bei 1.)

In den MEISTEN Fällen sind es reine Kopien, da es eben zig Backups derselben Dateien gibt. ALLERDINGS - und hier wird es wichtig - hat WhatsApp in sehr wenigen Fällen die Namensgebung verhunzt, weshalb es nun vorkommen kann, wie in Beitrag #125 demonstriert, dass ein und dieselbe Datei einen identischen Namen haben (also auf erste Sicht reine Kopien sind), aber DENNOCH einen anderen Inhalt haben.

Und genau diese Dateien müssen auf jeden Fall gesucht und gefunden werden, denn in diesen Fällen muss ich manuell prüfen, welche Dateien nun passen. Das kann das Script nicht wissen.

In den vergangenen Scripts wurden diese Dopplungen aber irgendwie nicht gefunden (siehe nochmals Beitrag #125 hierfür).

simpsonsfan schrieb:
2a. Du sprichst von Original. Sind dir bei gleichem Dateiinhalt Dateiattribute (wie bspw. das Windows Erstelldatum-Attribut) wichtig? (Ich vermute nein, also einfach irgendeine der Dateien gewünscht.)

Siehe Frage 2.)

Wichtig ist der Inhalt, die Metadaten nicht wirklich, außer eben der Dateinamen, denn der muss ja mit dem jeweiligen Eintrag in der WA-Datenbank übereinstimmen.

simpsonsfan schrieb:
4. Kann ich, wie bereits erwähnt, nicht nachvollziehen.

Ich hoffe, dies hat sich mit der Erklärung zu 2.) und 2a) nun geklärt, was ich meinte. Falls nicht, versuche ich es dann nochmal zu erklären.

simpsonsfan schrieb:
5. Siehe 1a, was heißt "originale Pfadstruktur wahren"?

Hierzu auch wieder die Antwort bei 1a). Auch dies sollte hoffentlich nun klar geworden sein durch die Erklärung, falls nicht, erkläre ich es auch nochmal.

simpsonsfan schrieb:
5a. Wohin dürfte eine Datei "f:\medien\Medien Stand 17.06.24\Media\WhatsApp Images\Private\IMG-20220307-WA0001.jpg" hin? Welcher Teil des Pfads müsste beachtet werden.

Auch hier wieder 1a)

Alles, ab Media und darunter ist relevant. Alles, was darüber ist, ist nicht relevant.

Diese Datei würde also optimalerweise im Zielordner gefunden dort liegen:

F:\gefunden\Media\WhatsApp Images\Private\IMG-20200307-WA0001.jpg

Eben so, wie sie auch im Suchordner/Pool abgelegt ist ab dem Ordner "Media" und darunter.

simpsonsfan schrieb:
5b. Wo (in welchen Verzeichnissen) dürfte nach einer "Media/WhatsApp Images/Sent/IMG-20220304-WA0002.jpg" gesucht werden?

Im Suchordner / Pool läge diese Datei analog in irgendwelchen (sicherlich auch mehreren Ordnern (da es ja meist mehr als 1 Backup gibt) Ordnern, die dann irgendwann als Unterordner "Media/WhatsApp Images/Sent/IMG-20220304-WA0002.jpg" haben werden.

Ob dies aber nun "Backups\Media\etc" ist oder "Sicherung 17.04.22\Neu\neu\blablabla\blubb\Media\etc" kann unterschiedlich sein.

Wichtig wird's immer erst ab "Media\etc".

simpsonsfan schrieb:
5c. Wo (in welchen Verzeichnissen) dürfte nach einer "Media/WhatsApp Images/IMG-20210328-WA0000.jpg" gesucht werden?

Siehe 5b). Analog dazu.

simpsonsfan schrieb:
6. Wohin sollen doppelte Dateien kopiert werden?

Ursprünglich hatten wir doppelte Dateien ja in einen extra Ordner kopiert. Dies würde ich nun revidieren und der Übersicht halber die doppelten Dateien einfach zusammen zu den Originalen reinkopieren, nur eben mit Namenszusatz _1 _2 _3 _4 etc.

Damit sehe ich durch die Thumbnails dann direkt auf einen Blick, ob es tatsächlich nur Dopplungen sind, die ich dann mittels Windowssuche nach "_1" "_2" "_3" alle auf einen Schlag dann direkt rauslöschen kann, da nicht benötigt, oder aber ob es sich um die wichtigen Dopplungen, wie in der Antwort auf 2.) beschrieben, handelt. Für die muss ich nämlich dann manuell entscheiden und kann sie nicht direkt rauslöschen.

Also Dopplungen dann am besten einfach in denselben Ordner wie das Orignal. Wenn es ein Bild ist, dann halt Media/WhatsApp Images/
Wenn es ein von mir gesendetes Bild ist, dann eben in Media/WhatsApp Images/sent

Und so weiter...

simpsonsfan schrieb:
6a. Wie soll das Namenschema für doppelte Dateien aussehen?

Das darf sich nicht ändern, mit Aussnahme des _1 _2 _3-Zusatz, siehe 6.)
simpsonsfan schrieb:
6aa. Soll eine Datei den Originalnamen bekommen?

Das verstehe ich nicht.

Ich hoffe, nach diesen Erläuterungen ist nun alles klar(er). Falls nicht, bitte nochmal fragen.
Vielen Dank!
 
Zuletzt bearbeitet:
Das "Original" war mal auf der SD-Karte, alles andere sind Kopien. Die Kopien werden wiederum kopiert (nach F:\gefunden.) Wie sollen die Dateien heißen, war die Frage.

Zudem verstehe ich immer noch nicht, weshalb du unbedingt mehrfach die gleiche Datei in dem Zielordner benötigst, nur um sie dann später wieder manuell weg zu löschen. (Stichwort Dateivergleich.)

Vielleicht komme ich irgendwann noch dazu, das Skript zu überarbeiten.

Was #125 und die fehlenden Kopien betrifft, bist du dir sicher, dass du die Datei nicht aus Versehen aus dem Zielordner gelöscht hast? Und/oder dass die Datei auch in der Liste (search.txt) aufgeführt war? Aus der Ferne lässt sich sowas schlecht debuggen.
 
simpsonsfan schrieb:
Das "Original" war mal auf der SD-Karte, alles andere sind Kopien. Die Kopien werden wiederum kopiert (nach F:\gefunden.) Wie sollen die Dateien heißen, war die Frage.

Ich versuche es mal auf diesem Weg:
stell dir vor, du hast einen Medien-Ordner auf dem Handy. Von diesem Ordner machst du nun ein 1:1 Backup auf dem PC, das heißt, du ziehst den Ordner komplett rüber.

Nun vergeht eine Weile. Der Medien-Ordner auf dem Handy wird mit der Zeit weiter gefüllt mit neuen Dateien, die alten bleiben aber erhalten. Er füllt sich also kumulativ, neue Dateien gesellen sich zu den alten.

Irgendwann wird's dann Zeit für ein neues Backup des Medien-Ordners, da ja mit der Zeit neue Dateien hinzugekommen sind.

Anstatt nun aber umständlich nur alle neuen Dateien seit dem letzten Backup zu sichern, sicherst du einfach direkt nochmal den gesamten Medienordner auf den PC.

Daraus folgt: Alle Dateien bis zum ersten Backup sind dadurch nun Kopien geworden, da sie exakt so im ersten Backup ja auch schon vorhanden waren. Nur die neu dazu gekommenen Dateien sind einzigartig im zweiten Backup.

Dieses Prozedere machst du über die Jahre immer so weiter und erzeugst dadurch automatisch immer mehr Kopien der jeweils in den älteren Backups ja schon vorhandenen Dateien.

So kommt es dann, dass du von dem ältesten Bild im Medienordner irgendwann zig Kopien hast, du immer wieder neue Komplettbackups angelegt hast.

Wenn ich nun nach einer Datei namens "Katze.jpg" in Windows suche, dann listet es mir zig Mal "Katze.jpg" auf, da exakt diese Datei in den ganzen Backup-Ordnern vorhanden ist.

Welche davon ich jetzt der zig identischen Dateien als das "Original" nehme, spielt keine Rolle. Ich könnte die Datei aus dem ersten Backupordner nehmen, aber auch aus dem 20sten Backupordner. Sind ja eh alles dieselben (nur halt Kopien).

Das Script wird nun alle Dateien namens "Katze.jpg" aus sämtlichen Backup-Ordnern finden (hoffe ich doch) und muss dann beim Kopieren in den Gefunden-Ordner aber dann halt noch einen Zusatznamen geben, weil zwei Dateien mit identischem Namen geht ja nicht. Also sollte es dann einfach "Katze_1", "Katze_2", "Katze_3" etc machen.

Warum ich all diese identischen Kopien aber trotzdem finden und sichern lassen will, erkläre ich nun nochmal:

simpsonsfan schrieb:
Zudem verstehe ich immer noch nicht, weshalb du unbedingt mehrfach die gleiche Datei in dem Zielordner benötigst, nur um sie dann später wieder manuell weg zu löschen. (Stichwort Dateivergleich.)
Ich hatte das ja hier:

In den MEISTEN Fällen sind es reine Kopien, da es eben zig Backups derselben Dateien gibt. ALLERDINGS - und hier wird es wichtig - hat WhatsApp in sehr wenigen Fällen die Namensgebung verhunzt, weshalb es nun vorkommen kann, wie in Beitrag #125 demonstriert, dass ein und dieselbe Datei einen identischen Namen haben (also auf erste Sicht reine Kopien sind), aber DENNOCH einen anderen Inhalt haben.

Und genau diese Dateien müssen auf jeden Fall gesucht und gefunden werden, denn in diesen Fällen muss ich manuell prüfen, welche Dateien nun passen. Das kann das Script nicht wissen.

In den vergangenen Scripts wurden diese Dopplungen aber irgendwie nicht gefunden (siehe nochmals Beitrag #125 hierfür).

und mit Beitrag #125 schon versucht zu erklären.

Das Problem ist: manche dieser doppelten Dateien heißen zwar genauso identisch wie alle anderen Doppelungen, haben aber einen anderen Inhalt. Und meistens benötige ich exakt diese Dateien, die zwar identisch heißen, wie alle anderen Dopplungen, aber eben nicht denselben Inhalt haben.

Wie finde ich nun exakt diese Dateien, wenn man nicht sämtliche Dopplungen mehrfach in den Zielordner kopiert? Anhand des Thumbnails sehe ich ja dann direkt schon im Ordner, welche der sämtlichen doppelten Dateien vom Inhalt her identisch sind (--> können alle weg bis aufs Original), und welche der doppelten Dateien dann NICHT identisch sind, sondern einen anderen Bildinhalt haben. In diesen Fällen muss ich dann manuell entscheiden, ob nun diese Datei das Original ersetzt, oder ob das Original bleiben kann und diese Dopplung dann auch vollends weg kann.

Ich hoffe, jetzt ist es verständlicher geworden?
Sofern das Script nicht auch nach Inhalten suchen kann, sehe ich keine andere Möglichkeit, als einfach alle Dopplungen zu kopieren, weil unter diesen Dopplungen werden dann hoffentlich auch diese Fälle dabei sein, die zwar identisch heißen, aber eben dann DOCH keine Dopplungen sind, da sie einen anderen Inhalt haben.

simpsonsfan schrieb:
Was #125 und die fehlenden Kopien betrifft, bist du dir sicher, dass du die Datei nicht aus Versehen aus dem Zielordner gelöscht hast? Und/oder dass die Datei auch in der Liste (search.txt) aufgeführt war? Aus der Ferne lässt sich sowas schlecht debuggen.

Im Medienordner / Quellordner war sie jedenfalls da, dort habe ich sie mit der normalen Windows-Suche dann gefunden. Dass ich sie vielleicht vorschnell aus dem Gefunden-Ordner gelöscht haben könnte, wäre möglich, hatte ich aber nicht den Eindruck.

In der Search.txt MUSS sie logischerweise aufgeführt gewesen sein, denn sonst hätte das Script ja auch gar nicht alle anderen Dateien mit identischem Namen gefunden und kopiert. Der Dateiname ist ja derselbe, nur der Dateiinhalt anders...
 
Marvolo schrieb:
Das Script wird nun alle Dateien namens "Katze.jpg" aus sämtlichen Backup-Ordnern finden [...] und [...] beim Kopieren in den Gefunden-Ordner [...] einen Zusatznamen geben, Also sollte es dann einfach "Katze_1", "Katze_2", "Katze_3" etc machen.
Dann wird aus den vier Dateien
Code:
"/BackupA/Media/WhatsApp Images/Katze.jpg"
"/BackupB/Media/WhatsApp Images/Katze.jpg"
"/BackupC/Media/WhatsApp Images/Katze.jpg"
"/BackupD/Media/WhatsApp Images/Katze.jpg"
somit
Code:
"/gefunden/Media/WhatsApp Images/Katze_1.jpg"
"/gefunden/Media/WhatsApp Images/Katze_2.jpg"
"/gefunden/Media/WhatsApp Images/Katze_3.jpg"
"/gefunden/Media/WhatsApp Images/Katze_4.jpg"
Insbesondere ist keine Datei
Code:
"/gefunden/Media/WhatsApp Images/Katze.jpg"
vorhanden, weil keine Datei den Originalnamen erhält. Aus den langen Texten entnehme ich jetzt, dass du durchaus eine Datei mit dem Originalnamen haben möchtest, das muss man aber eben einfach irgendwo in Anforderungen definieren.
Und während ich im selbst Allgemeinen gerne ausführliche Erklärungen verwende, sollten Anforderungen an Software kurz und präzise sein. Sie sollten so kurz sein, dass man, um den gleichen Sinn wiederzugeben, nichts mehr kürzen kann.
Im Übrigen ist "Das Namensschema darf sich nicht ändern" keine Antwort auf die Frage "Wie lautet das Namensschema?"

Marvolo schrieb:
Sofern das Script nicht auch nach Inhalten suchen kann, sehe ich keine andere Möglichkeit,
Natürlich kann man Dateien nach ihrem Inhalt vergleichen.
Deshalb enthalten die Anforderungen das WAS gemacht werden soll, nicht das WIE. (Siehe auch https://xyproblem.info/)
Du schriebst
4. Aus diesem Grund müsste das Script schlichtweg ALLES kopieren, sowohl [...] inhaltsgleiche Kopien der Originaldatei [...], als auch die [...] mit unterschiedlichem Inhalt
Dabei ist erstens nicht ersichtlich, was dieser Grund ist, zweitens gibst du hier vor, dass inhaltsgleiche Dateien kopiert werden müssen. Wozu es, soweit ich das sehe, eigentlich keinen Grund gibt.
Marvolo schrieb:
In der Search.txt MUSS sie logischerweise aufgeführt gewesen sein, denn sonst hätte das Script ja auch gar nicht alle anderen Dateien mit identischem Namen gefunden und kopiert.
Ich glaube, du verwechselst hier search.txt und output.txt. Jedenfalls ist das schlicht nicht korrekt. Schau doch bei Gelegenheit mal nochmal nach, was in search.txt und in der 03_Dateien_kopieren_Duplikate.bat drin stand.


Das ist jetzt alles nicht böse oder vorwurfsvoll gemeint, und ich will auch nicht kleinlich sein, aber saubere Anforderungen erleichtern das Leben einfach. Denn sonst ändert sich das Ziel während der Bearbeitung mehrfach und man muss alles doppelt und dreifach machen, das macht dann einfach keinen Spaß.

Wie gesagt, evtl. komme ich mal noch dazu, den Code von mir in sinnvoller Weise anzupassen. Kann aber nichts versprechen.
Wie weit bist du denn mit dem Projekt schon? Falls du bereits alles händisch sortiert hast, hätte sich das ja so gesehen bereits erledigt.
 
simpsonsfan schrieb:
vorhanden, weil keine Datei den Originalnamen erhält. Aus den langen Texten entnehme ich jetzt, dass du durchaus eine Datei mit dem Originalnamen haben möchtest, das muss man aber eben einfach irgendwo in Anforderungen definieren.

Das ist korrekt. Irgendeine der vielen Backup-Dateien darf dann das Original sein. Ob dies jetzt aus Backup A ist oder aus Backup Z, spielt keine Rolle.

Das Script sollte dann halt irgendeine der vielen "Katze.jpg" als "Katze.jpg" kopieren und alle weiteren Instanzen müssen dann logischerweise Katze_1 etc. sein.
simpsonsfan schrieb:
Im Übrigen ist "Das Namensschema darf sich nicht ändern" keine Antwort auf die Frage "Wie lautet das Namensschema?"

Damit war gemeint, das Namensschema sollte genauso bleiben, wie es im Quellordner ist. Die Dateien haben ja einen ganz bestimmten WhatsApp-Aufbau im Namen, also sowas wie:

IMG-20200304-WA0000.jpg

Das ist also das Namensschema. Gibt es nun mehrere dieser Dateien, dann ist irgendeine davon das "Original", also vom Namen her so wie oben, und alle weiteren identischen sind dann eben IMG-20200304-WA0000_1.jpg.

Ich frage mal anders herum:
ist denn jetzt nach meinen Erklärungen noch irgendetwas unklar oder verwirrend? Besser kann ich es eigentlich nicht mehr wiedergeben.

Ich bin dir ja sehr dankbar, dass du so viel Mühe und Zeit da reininvenstierst bzw. schon hast. Natürlich habe ich jetzt nicht absichtlich unpräzise Angaben gemacht - ich dachte, so wie ich es formuliert habe, wäre es eigentlich verständlich und klar gewesen. Und das letzte Script macht ja im Grunde auch alles, wie es soll - nur, dass es halt diese eine bedeutende Kopie, die dann vom Inhalt her anders war als alle anderen Duplikate, irgendwie nicht kopiert hat. Aber eventuell war das auch irgendwo ein Fehler auf meiner Seite. Das müsste ich jetzt einfach nochmal alles durchlaufen lassen.

Bezüglich Stand des Projekts: ganz fertig bin ich noch nicht - also es wird demnächst schon noch einige weitere output.txts geben. Die Search.txt sollte sich ja nicht mehr ändern, denn die spiegelt ja eigentlich nur den Quellordner/Medienordner wieder und dort ändert sich ja im Grunde nix.

Dies dann auch als Antwort auf die Frage, ob die search.txt fehlerhaft war - könnte sein, muss ich dann nochmals nachprüfen. Aber wenn ich mit der Windows-Suche die entsprechende Datei dann in diesem Ordner finde, dann sollte diese doch auch in der Search.txt Datei indexiert sein.

Jedenfalls Danke nochmals für die große Mühe(n)!
Ergänzung ()

simpsonsfan schrieb:
Dabei ist erstens nicht ersichtlich, was dieser Grund ist, zweitens gibst du hier vor, dass inhaltsgleiche Dateien kopiert werden müssen. Wozu es, soweit ich das sehe, eigentlich keinen Grund gibt.
OK, wenn das Script erkennen kann, dass unter den vielen Dopplungen mit identischem Namen irgendwo der Inhalt anders ist als bei den anderen, dann gebe ich natürlich Recht, DANN bräuchte es die inhaltsgleichen Dateien nicht kopieren als Dopplungen, sondern lediglich solche, die den identischen Dateinamen haben, aber nun doch einen anderen Inhalt.

Ich ging davon aus, das Script kann keine Inhalte unterscheiden, deswegen dachte ich, man bräuchte einfach alle Dopplungen, die es gibt, damit ICH dann händisch schauen kann, wo es eine Datei mit identischem Namen aber ANDEREM Inhalt gibt.
 
s1ave77 schrieb:
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

Hallo,

da ich momentan wieder Zeit gefunden habe, möchte ich dieses Projekt endlich fertigstellen - auch weil ich nicht weiß, wie lange mir WhatsApp auf meinen momentan gerooteten und längst nicht mehr aktuellen Galaxy S6 & S7-Geräten noch erhalten bleibt, bevor der Support eingestellt wird. Root brauche ich aber für meine Arbeiten, deshalb drängt jetzt vermutlich auch etwas die Zeit.

Ich habe mittlerweile 2 Quellenordner, die allesamt in unterschiedlichen Ebenen WhatsApp-Dateien enthalten.
Ich müsste also für die Indizierung der Quellordner 2 Ordner angeben, nicht nur einen.
Zudem sollen weiterhin zwar alle Dateien gefunden werden, die ein "WA0" im Namen haben (z.B. IMG-20240909-WA0000.jpg) - allerdings gibt es auch einige WhatsApp-Dateien, die das nicht im Dateinamen haben, sondern deren Dateinamen z.B. so aussieht:

IMG-20240119-4929385792837@s.whatsapp.net-270274c7-a457-46b3-8b9a-21edb38a92c7.jpg
IMG-20240118-4923940750984-1449663099@g.us-fd9ded52-e887-400f-a61c-1147fee81417.jpg

In diesen Dateien kommt also das "WA0" gar nicht vor, dafür aber eine andere Konstante (siehe rot gefärbt).

Das Index-Script müsste also nicht nur nach Dateien suchen und indizieren, die ein "WA0" enthalten, sondern zusätzlich auch nach Dateien, die ein "s.whatsapp.net" und ein "g.us" im Dateinamen haben. Denn sonst fallen diese Dateien unter den Tisch und es findet nur die herkömmlichen, standardmäßig benannten WA-Dateien.

Wie muss das obige Index-Script nun dahingehend abgeändert werden, dass also 2 verschiedene Quell-Ordner (mit jeweils Unterordnern) angegeben werden und dass es nicht nur WA0-Dateien findet, sondern auch jene, die ein s.whatsapp.net bzw. g.us im Dateinamen haben?

Und auch ganz wichtig wäre:
Doppelt/mehrfach vorkommende Dateien sollen jeweils alle einzeln mit ihren jeweiligen Pfaden indiziert werden.

z.B.:

IMG-20200903-WA0001.jpg (in C:\Test\Blubb\)
IMG-20200903-WA0001.jpg (in C:\Anderes\Blubb\Test\WhatsApp\)

Da sollen in der search.txt Index-Datei beide Dateien mit ihren jeweiligen Pfaden auftauchen. Also identische Dateinamen in unterschiedlichen Lokalisationen/Pfaden müssen auch unbedingt alle einzeln indiziert werden, egal wie häufig/mehrfach identisch sie auftauchen.

Zusammengefasst also:
es sollen alle WhatsApp-Dateien gefunden / indiziert werden samt ihres jeweiligen Speicherorts/Pfads, die ein WA0 und ein s.whatsapp.net und ein g.us im Namen haben, unabhängig davon, ob es vom Dateinamen her identische Kopien noch an anderen Stellen gibt. Alles, was die obigen Elemente im Dateinamen hat, soll mit jeweiligem Speicherpfad indiziert werden.

Vielen Dank
Ergänzung ()

Update:

ChatGPT spuckt folgendes raus - ist das brauchbar?

Python:
import os

# Quellordner definieren
source_dirs = [
    r"C:\Users\User\Backup alte Handys",
    r"C:\Users\User\WA Backups\MEDIEN"
]

# Zieldatei für die Ergebnisse
output_file = "search.txt"

# Suchbegriffe
keywords = ["WA0", "s.whatsapp.net", "g.us"]

# Funktion zum Durchsuchen der Ordner
def search_files(source_dirs, keywords, output_file):
    results = []
    
    for source_dir in source_dirs:
        if not os.path.exists(source_dir):
            print(f"Ordner '{source_dir}' existiert nicht.")
            continue

        # Durchlaufe alle Dateien in diesem Ordner und Unterordnern
        for root, _, files in os.walk(source_dir):
            for file in files:
                if any(keyword in file for keyword in keywords):
                    full_path = os.path.join(root, file)
                    results.append(full_path)
                    print(f"Gefunden: {full_path}")
    
    # Ergebnisse in die Datei schreiben
    with open(output_file, "w", encoding="utf-8") as f:
        for line in results:
            f.write(line + "\n")
    
    print(f"Fertig. Ergebnisse sind in '{output_file}' gespeichert.")

# Hauptfunktion ausführen
if __name__ == "__main__":
    search_files(source_dirs, keywords, output_file)
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben