Nullauffüllung in V. 1.3.6

  • 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.

  • @edgar-rtf: Danke für die erschöpfende Behandlung des Themas :) Noch ein Hinweis bzw. eine Meinungsäußerung von mir: Meine Meinung ist, dass Programme bei Dateien, bei denen eine automatische Sortierung gewünscht ist, immer eine Nummerierung mit führenden Nullen machen sollten. Denn ob der Windows Explorer, das richtig darstellt, ist mir in dem Moment egal, an dem ich die Dateien in irgendeinen Mediaplayer, Brennprogramm oder auf meinen MP3-USB-Stick kopiere. Und die Wahrscheinlichkeit, dass dann die "Track11.mp3" vor der "Track2.mp3" kommt, ist hier 50%. Die Nummerierung mit führenden Nullen ist ja auch abwertskompatibel, sie funktioniert sozusagen immer. Insofern ist das derzeitige Verhalten von Audacity ein Fehler, was ja Leland so auch schon bestätigt hat und versprochen hat, den Fehler wieder zu beheben. Und insofern verhält sich auch Dein Radioprogramm sehr komisch. Wenn sie es richtig machen wollten, würden Sie den Dateinamen ohnehin im Format "YYYY-DD-MM HH_SS" ausgeben, damit auch die Sortierung nach den Tagen konsistent ist. So wird das jedenfalls bei Logfiles gemacht.

  • Zitat

    Meine Meinung ist, dass Programme bei Dateien, bei denen eine automatische Sortierung gewünscht ist, immer eine Nummerierung mit führenden Nullen machen sollten ... Insofern verhält sich auch Dein Radioprogramm sehr komisch. Wenn sie es richtig machen wollten, würden Sie den Dateinamen ohnehin im Format "YYYY-DD-MM HH_SS" ausgeben, damit auch die Sortierung nach den Tagen konsistent ist. So wird das jedenfalls bei Logfiles gemacht.


    Das richtige Format wäre: YYYY-MM-DD HH_SS weil sonst kann ich es nicht chronologisch "richtig" sortieren (aber ich glaube das ist das, was du meintest).


    Ich bin im Prinzip vollkommen der gleichen Meinung, deshalb schrieb ich auch "Ich habe es nicht erfunden, sondern ich bin der, der mit diesem Schwachsinn leben muss". Ich wollte nur zeigen, dass es Programme gibt, die sich noch "falscher" als Audacity verhalten und wie es relativ einfach repariert werden kann, selbst in Fällen, in denen Windows bereits hoffnungslos überfordert ist.


    Die Radio-Software wird hier in den nächsten Monaten aber sowieso umorganisiert und ich hoffe mal, dass sich das Thema (mit der Radio-Software) dann von alleine erledigt. In Audacity wäre es natürlich nach wie vor die beste Lösung, einfach einen Schalter für "Führende Nullen oder keine" einzubauen.