465000 JPGs in einem einzigen Ordner ...

  • Vorgeschichte:
    Habe für jemanden Daten von dessen Festplatte gerettet, mittels Photorec.
    Anschließend mit PhotoRec_Sorter.au3 die Dateien nach Endung sortiert.
    Resultat: Rund 20 Ordner, prall gefüllt mit den jeweiligen Dateitypen.

    Das große Problemkind ist der JPG-Ordner. Dieser beinhaltet über 465000 Bilder (und um Witzen vorzubeugen: nix Porno, sondern Fotograf).
    Mein eigentlicher Wunsch wäre, diese abdertausenden Bilder zunächst mal nach Kameramodell sotiert in Unterordner zu verschieben und dann, in einem zweiten Schritt, für jeden Aufnahmetag je einen Unterordner zu erstellen und die Bilder anhand dessen dorthin zu verschieben.

    OK, ich wäre schon genügend glücklich über allein nur den letzten Schritt. Also auf die Sortierung nach Kameramodell könnte ich husten, wenn es gelingt, einfach nur die Bilder nach Datum der Aufnahme in Unterordner zu verfrachten, gemäß dem Schema:
    2008-03-19
    2008-03-20
    2009-02-30
    ...

    Der Explorer meiner ollen XP-Kiste rödelt ewig, wenn ich versuche den dicken Ordner zu öffnen. Ich habe auch schon Tools von Heise.de heruntergeladen, die dazu dienen sollen, Dateien automatisch zu sortieren/verschieben. Aber auch damit gab es Probleme, in Form von Hängern. Es sind wohl einfach gar zu viele Dateien im Ordner.

    Sicher könnte ich jetzt ein eigenes Script schreiben für diesen Job, an dem ich aber vermutlich tagelang sitzen würde, bis es funzt. Etwas viel Arbeit, für nur einmalige Anwendung und für lau. Der Fotograf will eigentlich nur mal schnell auf bestimmte Bilder zugreifen können, ohne viel Zirkus. So wie es jetzt ist, nützt ihm meine Datenrettung "goa nix".
    Das Problem dürfte doch sooo exotisch nicht sein und es muss ja auch gar nicht mal unbedingt per AutoIt geschehen.
    Kennt vielleicht jemand ein real funktionierendes Tool für so einen Job, oder hat zufällig jemand ein halbwegs mundfertiges Script zur Hand?

    Die kleine Erschwernis liegt halt darin, dass nicht das Filedatum interessant ist, für die Sortierung, sondern das tatsächliche Aufnahmedatum des Bildes. Da müssen wohl die EXIF-Daten ausgewertet werden.
    Wie ich bereits weiß, gibt es ein UDF für den Zugriff auf EXIF-Daten.

    Wer weiß Rat?

    Ich code, also bin ich!

  • Wieso sollte es Tage dauern, bis du das Script fertig geschrieben hast? Geht in meinen Augen schneller, als etwas fertiges zu tun.
    Die EXIF Daten kannst du ja auswählen, und dann sortierst du und fängst an all das, was noch nicht als Ordner existiert, anzulegen. Diese Ordner sortierst du dann auch nochmal, fertig.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Es muss ja einen Grund geben, warum sich die von mir ausprobierten Tools aufhängten. Jedenfalls werte ich ein zweistündiges Festhängen des Fortschrittbalkens mal als Aufhänger.

    Mein Ansatz für ein Script wäre daher der, die Dateien einzeln auf den EXIF-Inhalt abzuklopfen und unmittelbar zu verschieben. Existiert der Zielordner noch nicht, wir er angelegt.
    Bei dieser Methode könnte man das Script jederzeit abbrechen und später neu starten; was bis dahin bereits abgearbeitet wurde, ist dann auch definitiv abgearbeitet.

    Tools hingegem, die bevor sie etwas verschieben zunächst mal fröhlich die EXIF-Daten aller Dateien auswerten, haben noch rein gar nichts erledigt, wenn sie sich noch vor dem Verschieben verschlucken.

    Und warum ich tagelang brauchen würde? - Weil ich mit AutoIt noch nicht so fit bin, wie Ihr.
    Der Fotograf will unbedingt morgen seine Festplatten abholen, trotzdem ich ihm sagte, dass ich noch an der Sortierung hänge. Bis morgen bekomme ich kein Tool gebacken - das lehrt meine Erfahrung mit anderen Scripten, wo auch dauernd scheinbare Kleinigkeiten in stundenlangen, am Ende tagelangen Kampf ausarteten.

    Ich code, also bin ich!

    • Offizieller Beitrag

    Es gibt eine UDF (Anhang), die die EXIF-Daten auslesen kann.
    Und hier ein kleines Beispiel für die Benutzung:

    Ich denke, den Rest (alle Dateinamen einlesen, in einer Schleife durchgehen und umbenennen/verschieben) bekommst Du selbst hin, oder?

  • Ich vermute weil das Listing von so vielen Dateien einfach utopisch ist und endlos lang dauert. Mach doch spaßhalber mal den Befehl _FileListToArray auf dem Pfad und halt mit nem Timer fest, wie lange es dauert.
    €: Genau so, wie du es beschriebst, hätte ich es auch gelöst.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Oh, ich habe gerade einen echten Durchbruch geschafft. Ich glaube, ich bekomme doch noch ein Script fertig, in den nächsten Stunden.
    Das Ergebnis werde ich dann hier posten.
    Vielen Dank schon mal an alle, die sich (laut oder leise) 'nen Kopf gemacht haben!

    Ich code, also bin ich!

  • Erfolg! :)
    Habe (wider eigenem Erwarten) erfreulich schmerzfrei ein Script hinbekommen und soeben mit 1000 Bildern getestet, die anstandslos in die automatisch angelegten Zielordner verschoben wurden.
    Bilder ohne Aufnahmedatum im EXIF landen dabei in einem gesonderten Ordner.

    Ich mache das Script nun noch hübsch und poste es im Anschluss.

    Ich code, also bin ich!

  • Hier nun das einsatzbereite Script:

    Mir ist bewusst, dass man da noch einiges optimieren könnte, aber mir reicht es so.
    - Vielen Dank noch mal an alle, die dazu beigetragen, oder auch nur mitgedacht haben!

    Ich code, also bin ich!

  • Etwas viel Arbeit, für nur einmalige Anwendung und für lau. Der Fotograf will eigentlich nur mal schnell auf bestimmte Bilder zugreifen können, ohne viel Zirkus. So wie es jetzt ist, nützt ihm meine Datenrettung "goa nix".

    Für lau muß er nehmen was er bekommt, sprich sich selber hinsetzen und die Dateien manuel verschieben. Besser 465.000 unsortierte Bilder als gar keine.


    Hier nun das einsatzbereite Script:

    Dann kann er ja jetzt automatisiert verschieben.

  • Fataler Fehler,

    habe also stundenlang mein Script laufen lassen. Dabei hat sich zwischendrin eigenständig die USB-Platte abgemeldet, auf der die Aktion durchgeführt wurde (warum auch immer).
    Ungefähr die Hälfte der Dateien waren bis dahin bereits sortiert.
    Schulterzuckend das Script ein zweites Mal gestartet. Als alles fertig war, fand ich etliche leere Ordner vor und die Gesamtanzahl der Dateien betrug nur noch rund 274000 ... :(

    Theorie 1:
    Die folgende Zeile:
    FileMove($sFileWithPath, $sZielpfad & $sFileName, $FC_OVERWRITE + $FC_CREATEPATH)
    sollte vielleicht besser so aussehen:
    FileMove($sFileWithPath, $sZielpfad & $sFileName, $FC_CREATEPATH)
    Also nix Overwrite. Overwrite wird hier ja gar nicht benötigt, weil die von PhotoRec geretteten Dateien ohnehin einen individuell einzigartigen Dateinamen haben.

    Habe eben noch mal das Script mit der geänderten Zeile ausprobiert, an 2000 Dateien. Zwischendrin schoss ich gezielt das Script ab und startete es neu. Dabei ist kein Fehler aufgetreten. Nix leere Ordner und identische Anzahl Dateien wie vor der ersten Ausführung.

    Theorie 2:
    Die Windows-Option "Laufwerk für schnelle Dateisuche indizieren" war aktiviert.
    Eventuell hat sich Windows daran irgendwie verschluckt, dass während des Indizierens dauernd Dateien verschoben wurden.

    Theorie 3:
    Vielleicht war es auch nicht gut, dass der Windows-Papierkorb so konfiguriert war, dass er nur maximal 10% des Laufwerkplatzes verwendet.
    Ich hatte ja die Hoffnung, die verschwundenen Dateien im Papierkorb zu finden, aber darin war nur ein Teil vorhanden.

    Nun muss ich armer Wicht also die ganze Datenrettung wiederholen. Drei Tage im Stück hatte der Kram gedauert! :(

    Ich werde das Script doch noch etwas aufpolieren, so mit GUI und numerischer Anzeige der bereits bearbeiteten Dateien, statt dem simplen ConsoleWrite($sFileName & @CRLF).
    Wer noch gute Ideen hat, gerne her damit!


    Für lau muß er nehmen was er bekommt, sprich sich selber hinsetzen und die Dateien manuel verschieben. Besser 465.000 unsortierte Bilder als gar keine.


    Das mit "lau" war nur die vereinfachte Wahrheit.
    Der Fotograf beauftragte mich mit der Datenrettung gegen Bezahlung. Ich machte ihm einen sehr günstigen Preis, weil ich es für keine hohe Kunst hielt, Photorec zu starten und den Rechner 1-3 Tage laufen zu lassen.
    Womit ich aber nicht gerechnet hatte, das war die enorme Anzahl an Dateien.
    Bei meinen früheren Erfahrungen mit PhotoRec kamen immer nur wenige tausend Bilder zusammen; eine Anzahl, die der Windows-Explorer noch problemlos bewältigte.
    Der Ordner mit 465000 Bildern hingegen, war in dieser Form komplett unbrauchbar. Da kann man nicht mal manuell Dateien verschieben. Windows rödelt schon minutenlang, wenn man den Ordner nur in Listenansicht öffnen will und drinnen liegt alles chaotisch durcheinander, mit kryptischem Dateinamen vor.

    Ich mag es generell nicht, nach einer Preisvereinbarung die Forderung wegen "unerwarteter Schwierigkeiten" zu erhöhen. Lieber nehme ich so etwas auf meine eigene Kappe.
    So gesehen war es "für lau". Alle Zusatzarbeit, die mir das bescherte, ist unbezahlt.
    Aber natürlich hat der Fotograf den geringen Obolus abzudrücken, der vorab vereinbart war. Und natürlich geht er dann davon aus, anschließend auch einen Nutzen von der Aktion zu haben. Da kann ich ihm keinen Chaos-Ordner mit 465000 wild durcheinander gewürfelten Dateien präsentieren, an dem sich Windows überhebt.

    Ich code, also bin ich!

  • Der Zielpfad enthält ja ganz rechts den Backslash (siehe die aktive Zeile über filemove).

    Msgbox ist recht hinderlich, wenn sie oft kommt. Daher hatte ich während der Entwicklung die Consolewriteline drin, um zu sehen, ob die Pfade auch stimmig zusammengesetzt wurden.
    Die Pfade stimmen schon, da fehlt kein Backslash oder so.

    Getestet an 2000 Dateien entstehen ordnungsgemäß einige Ordner und in jedem befinden sich auch genau die Bilder, die an jenem Tag aufgenommen wurden.

    Ich code, also bin ich!

    • Offizieller Beitrag

    Wer noch gute Ideen hat, gerne her damit!

    1. Den Ziel-Dateinamen auch entsprechend den EXIF-Daten erstellen nach folgendem Muster: "JJJJ-MM-TT___HH-MM-SS_(C).jpg"
    Wobei man aufpassen muss, dass in der Sekunde evtl. auch mehrere Bilder gemacht worden sind, deswegen der Counter "(C)".

    2. Statt FileMove zu benutzen, lieber FileCopy und die Rückgabe von FileCopy prüfen, wenn erfolgreich, dann FileDelete.
    Das ist sicherer als FileMove. Um ganz sicher zu gehen, könntest Du vor dem FileDelete auch ein Verify durchführen. Das ist aber sehr langwierig.

    3. Unbedingt eine Fehlerbehandlung von "_FileGetProperty" einfügen. Wenn ein Bild fehlerhafte EXIF-Daten aufweist, erstellst Du falsche Ordner.

  • 1. Den Ziel-Dateinamen auch entsprechend den EXIF-Daten erstellen nach folgendem Muster: "JJJJ-MM-TT___HH-MM-SS_(C).jpg"
    Wobei man aufpassen muss, dass in der Sekunde evtl. auch mehrere Bilder gemacht worden sind, deswegen der Counter "(C)".

    Ja, macht Sinn.
    Ist zwar relaiv unnötig, schließlich kann Windows auch nach Aufnahmedatum sortieren, wenn man es entsprechend konfiguriert, aber mit einem Dateinamen nach deinem Vorschlag muss dazu nichts konfiguriert werden, das macht die Sache für 'nen DAU komfortabler.

    Statt desir vorgeschlagenen Counters nehme einfach den von PhotoRec vergebenen, einzigartigen Dateinamen (sind 8 bis 10 Zeichen), den ich an den Zeitstempel anhänge.
    Das dürfte schneller gehen, als vor dem Verschieben zu testen, ob eine gleichnamige Datei schon vorhanden ist und dann 'ne Zählschleife zu starten, bis eine freie Nummer gefunden wurde.


    2. Statt FileMove zu benutzen, lieber FileCopy und die Rückgabe von FileCopy prüfen, wenn erfolgreich, dann FileDelete.
    Das ist sicherer als FileMove. Um ganz sicher zu gehen, könntest Du vor dem FileDelete auch ein Verify durchführen. Das ist aber sehr langwierig.

    Guter Vorschlag. Zwar trauere ich dann der Einfachheit von Filemove hinterher, das ja auch automatsich den Zielordner erzeugt, aber ich dachte mir sowieso schon, dass es Sinn macht, die Ordner quasi "von Hand" (mit ein paar zeilen Quelltext) zu erzeugen, statt Filemove das erledigen zu lassen.
    Einerseits um mehr Kontrolle zu haben, andererseits um jederzeit die Ordnerzahl zu kennen und im GUI anzeigen zu lassen, während das Script arbeitet:

    Anzahl erzeugter Ordner: 223
    Verschobene Dateien: 275356

    So kann man abschätzen, wie lange das Script wohl noch werkeln wird.
    Dazu dann noch ein Button zum Pausieren.
    Und so wie es gestrickt ist, kann man es auch jederzeit beenden und später neu starten, um den Rest weg zu sortieren. Man muss also nicht stundenlang im Stück den Rechner laufen lassen.


    3. Unbedingt eine Fehlerbehandlung von "_FileGetProperty" einfügen. Wenn ein Bild fehlerhafte EXIF-Daten aufweist, erstellst Du falsche Ordner.

    Klingt auch gut.
    Ja, es sind ein paar sonderbare Ordner entstanden. Ohne von mir explizit so vorgesehen, landen alle Dateien ohne Zeitstempel in einem Ordner namens "--". Das ist nett, wenngleich unerwartet. :)
    Ein paar Dateien hatten unsinnige Zeitstempel, so dass ulkige Ordnernamen erzeugt wurden. Wobei ich bislang den Eindruck habe, dass das sogar ein angenehmer Effekt ist - so wird man auf die elegante Tour solche Dateien los, die z. B. aus Internet-Surfsessions stammen.
    Daher ja mein ursprünglicher Wunsch, zunächst nach Kameramodell zu sortieren und erst dann nach Datum.
    So hätte der Fotograf seine eigenen Aufnahmen schön getrennt von allem sonstigen Bildermüll.

    Ich werde wohl all Deine Vorschläge berücksichtigen und bedanke mich sehr, für die guten Einwürfe!

    Ich code, also bin ich!

    • Offizieller Beitrag

    Ist zwar relaiv unnötig, schließlich kann Windows auch nach Aufnahmedatum sortieren, wenn man es entsprechend konfiguriert, aber mit einem Dateinamen nach deinem Vorschlag muss dazu nichts konfiguriert werden, das macht die Sache für 'nen DAU komfortabler.

    Das hat auch noch andere Vorteile, wenn im Dateinamen gleich das Aufnahmedatum steht: beim anzeigen (z.B. mit IrfanView) sieht man gleich das Aufnahmedatum in der Titelzeile und muss nicht erst die EXIF-Daten aufrufen.

    Daher ja mein ursprünglicher Wunsch, zunächst nach Kameramodell zu sortieren und erst dann nach Datum.

    Das kannst Du doch noch einbauen. Vielleicht auch optional.