Dateinamen sortieren mit Windows, Teil vierhundertsechsundneunzigeinhalb...
Zitat
Du hast Recht, jetzt wird's komplett Off-Topic und hat weder mit Windows, noch mit Linux, noch mit Audacity was zu tun.
Hat es im Prinzip schon, weil das Nullen-Problem von Audacity genau die gleichen Ursachen hat.
Audacity ist Multiplattform Software und da es unter Unix, Linux, Mac OS X und Windows keine gemeinsame Vorstellung von "Dateinamen-Nummerierung" gibt, ist es meiner Meinung nach die Aufgabe von wxWidgets, C-Code zu erzeugen, der das jeweilige Betriebssystem zur Laufzeit erkennt und dann die Nummerierung dem Standard-Format des jeweiligen Systems entsprechend anpasst, was aber offenbar nicht der Fall ist.
Zitat
Ich verstehe unter "Dateinenamensortierung" und "Darstellung der Reihenfolge der Dateinamen" NICHT unterschiedliche Dinge.
Auf was wir uns wahrscheinlich sofort einigen können: Natürlich gibt es in der Windows API irgendwo eine Funktion um Dateinamen sowohl lexikalisch als auch numerisch zu sortieren, weil sonst könntest du z.B. ja auch gar nicht die Reihenfolge der Dateinamen im Windows Explorer umschalten. Ich frage mich aber nur, warum diese Funktion dann nicht von der Kommandozeile aus erreichbar ist.
Zitat
Mein erster Ansatz wäre LupasRename...
Danke für den Tipp mit LupasRename, ich kannte das Programm vorher tatsächlich noch nicht. Ich brauche es nicht zu installieren (ich kann es als ".exe" Datei direkt starten), es schreibt seine Konfiguration in eine ".ini" Datei und nicht in die Windows Registry, ich kann es also auf einem USB Stick überall mit hinnehmen, ohne dass ich ständig alle Konfigurationsdaten neu einstellen muss. Das ist für mich das wichtigste überhaupt, weil ich auf sehr vielen verschiedenen Rechnern arbeite. Ich habe es schon auf den USB Stick kopiert und werde das in den nächsten Tagen noch ausführlicher testen. Danke sehr auf jeden Fall schon mal.
[line]
Mein Problem sieht in der Realität folgendermassen aus:
Es geht um die automatische Synchronisation des Sendeablaufs mehrerer Radiosender. Es geht dabei um Sendearchive mit mehreren zehn- bis hunderttausend mp3 Dateien in mehreren hundert bis tausend Unterverzeichnissen. Es sind ausser Windows auch noch Unix, Linux und Mac OS X Rechner (mit teilweise unterschiedlichen Datei-Nummerierungs-Formaten) beteiligt. Die zugelieferten Daten kommen entweder über FTP aus dem Netz oder von externen USB Festplatten, die Dateilisten sind "durcheinander" numeriert, teilweise mit und teilweise ohne führende Nullen.
Das im Dateinamen kodierte Sendedatum ist aber immer das gleiche: TAG_MONAT_JAHR_STUNDE_Uhr_MINUTEN.mp3
Noch ein Problem ergibt sich bei der Verwendung von USB Festplatten unter verschiedenen Betriebssystemen. Das einzige Festplatten-Format, das zuverlässig sowohl unter Unix, Linux, Mac OS X und Windows funktioniert, ist das mittlerweile relativ veraltete FAT32 Format. Deshalb habe ich zusätzlich mit den durch FAT32 vorgegbenen Einschränkungen zu leben, wie etwa: keine Dateien grösser als 4 Gigabyte (bei Audio Dateien nicht so sehr das Problem), und keine Verzeichnisse mit mehr als 4096 Dateien (was meist hinten und vorne nicht ausreicht, so dass ein Verzeichnis meist auch noch in mehrere Unterverzeichnisse aufgesplittet werden muss).
Die "Standard Hardware Konfiguration", die ich bei der Arbeit am häufigsten vorfinde, ist ein Arbeitsplatzrechner mit Windows 2000 oder heutzutage meist Windows XP, der über einen Unix-Server mit dem Internet verbunden ist. Dabei habe ich auf dem Arbeitsplatzrechner (Windows) üblicherweise keine Administrator Rechte (ich kann keine Programme installieren), während ich auf dem Unix-Server üblicherweise nur Leserechte und Schreibrechte nur in sehr wenigen Verzeichnissen habe, insgesamt aber so, dass ich keine Unix Shell Skripte direkt auf dem Server laufen lassen kann.
Ich selber habe dieses System nicht "erfunden", sondern ich bin der, der damit leben und arbeiten muss.
[line]
Zitat
Bei allen Varianten dieses Ansatzes wäre keine einzige Zeile Batch-Code notwendig.
Auf Grund der hohen Anzahl von Dateien kommt eine Windows GUI Lösung schon alleine deshalb nicht in Frage, weil sie viel zu langsam ist. Der Windows Explorer braucht z.B. über zehn Minuten, bis er mehrere zehntausend Dateien eingelesen hat, bis dahin ist ein Batchfile schon längst fertig mit der Arbeit.
Zitat
Ein komplett anderer Ansatz, den ich ebenfalls schon des öfteren verfolgt habe, wäre, die Dateiliste als Text in Excel zu importieren
Excel ist keine Windows-eigene Lösung sondern muss als Zusatzpaket (Microsoft Office) dazugekauft werden. Deshalb ist auf den meisten Arbeitsplatzrechnern, auf denen ich arbeite OpenOffice installiert. Ausserdem läuft Excel nur unter Windows und scheidet für mich persönlich als allgemeine Lösung schon alleine deshalb von vornherein aus. Es gibt zwar natürlich einen "Excel"-Clone auch unter OpenOffice, ich halte eine solche Lösung aber schlichtweg für reinen Overkill.
Zitat
Man würde das Erstellungsdatum im Dateisystem zur Grundlage machen
Ist in sofern leider nicht machbar, weil es sich bei dem im Dateinamen kodierten Datum auch um einen Sendetermin in der Zukunft handeln kann, der leider nichts mit dem Erstellungsdatum der Datei zu tun hat (konnte stme natürlich nicht wissen).
Zitat
dritter Ansatz: dir /od
sortiert nach dem Datum des letzten Schreibzugriffs und nicht nach dem im Dateinamen kodierten Sendedatum, ist also aus dem gleichen Grund leider nicht brauchbar.
[line]
Um jetzt mal von dem allgemeinen Herumgemeckere wegzukommen, hier ein paar Beispiele, wie ich das normalerweise löse. Es handelt sich natürlich nur um Code-Fragmente, die demonstrieren sollen, wie die Dateinamen-Konvertierung mit AWK funktioniert. Ich sortiere natürlich keine Dateinamen mit "echo", sondern die Dateinamen-Konvertierung findet in der Realität üblicherweise in (wesentlich längeren) Synchronisations-Skripten statt.
(g)awk siehe: http://de.wikipedia.org/wiki/Awk
GAWK ist die GNU Version von AWK, Windows Versionen gibt es z.B. unter http://unxutils.sourceforge.net/ oder http://gnuwin32.sourceforge.net/packages/gawk.htm
FS="[_.]" - bedeutet "Dateinamen an Unterstrich und Punkt in Einzelteile zerlegen"
printf - ist die gleiche Funktion wie in C
$1, $2, usw. - sind die einzelnen Teile des Dateinamens (der erste Teil ist "$1")
Das im Dateinamen kodierte Datum ist: TAG_MONAT_JAHR_STUNDE_Uhr_MINUTEN.mp3
"17_1_2009_1_Uhr_40.mp3" in "17_01_2009_01_Uhr_40.mp3" umwandeln:
[m]echo 17_1_2009_1_Uhr_40.mp3 | gawk "BEGIN {FS=\"[_.]\"} {printf \"%02d_%02d_%04d_%02d_Uhr_%02d.%s\n\", $1, $2, $3, $4, $6, $7}"
=> 17_01_2009_01_Uhr_40.mp3[/m]
"17_01_2009_01_Uhr_40.mp3" in "17_1_2009_1_Uhr_40.mp3" umwandeln:
[m]echo 17_01_2009_01_Uhr_40.mp3 | gawk "BEGIN {FS=\"[_.]\"} {printf \"%d_%d_%d_%d_Uhr_%02d.%s\n\", $1, $2, $3, $4, $6, $7}"
=> 17_1_2009_1_Uhr_40.mp3[/m]
Wie auch bereits von stme oben vorgeschlagen, erzeuge ich aus dem im Dateinamen kodierten Datum erst einmal ein Zwischenformat, das auch ohne grössere Tricks mit jedem handelsüblichen "sort" Kommando in chronologoscher Reihenfolge sortiert werden kann:
JAHR_MONAT_TAG_STUNDE_MINUTE.mp3
"17_1_2009_1_Uhr_40.mp3" in "2009_01_17_01_40.mp3" umwandeln:
[m]echo 17_1_2009_1_Uhr_40.mp3 | gawk "BEGIN {FS=\"[_.]\"} {printf \"%04d_%02d_%02d_%02d_%02d.%s\n\", $3, $2, $1, $4, $6, $7}"
=> 2009_01_17_01_40.mp3[/m]
Daraus lassen sich dann sowohl eine Liste mit den Sendedaten in chronologischer Reihenfolge (die Steuerdatei für den Sendeablauf) sowie die jeweiligen Dateinamen (je nach Betriebssystem mit oder ohne führende Nullen) erzeugen bzw zurück-konvertieren.
Auf ähnliche Art und Weise liessen sich auch die Audacity Dateinamen nachträglich mit Nullen auffüllen.