Physische Reihenfolge

Juli 2017

Das Problem

Musikstücke auf einer Audio-CD sind in einer bestimmten Reihenfolge gebrannt und beim Abspielen wird die Musik auch genau in dieser Reihenfolge wiedergegeben. Soweit so gut.
Sehr wichtig ist die Reihenfolge in Tanzstunden, bei Bühnenauftritten und anderen Anlässen. Nun haben Sticks und MP3-Player inzwischen die Welt erobert, und da plötzlich gab es Probleme...
Mein über alles geschätzter MP3-Player enthält zwar Gigabytes an Speicher, ist selbst aber kaum größer als ein Kronenverschluss, hat natürlich kein Display, sondern einfach nur Klickkontakte. Zwar werden in Foldern (Ordnern) abgelegte MP3-Dateien sauber wiedergegeben, aber von einer gezielten Dateiauswahl kann natürlich keine Rede sein.
Also kopierte ich meine Musikstücke in der gewünschten Reihenfolge in den Player. Zunächst war alles prima, aber einige Dateien wollten nicht dahin, wo sie sein sollten. Das gleiche Problem zeigte sich bei der Verwendung von Sticks und Speicherkarten.
Man könnte zuerst an eine Sortierung z.B. nach Namen denken. Der naive Versuch, Dateien in titel01.mp3, titel02.mp3 usw. umzubenennen zeigte keinen Erfolg.
Als Nächstes denkt man natürlich an die Zeitstempel. Davon gibt es mindestens zwei: der Erstellungszeitpunkt und der letzte Änderungszeitpunkt. Nach einigen Versuchen glaubte ich, dass es der Erstellungszeitpunkt ist. Verschiedene Kopierverfahren einschließlich mancher Playlist-unterstützter Tools übernehmen leider den Erstellungszeitpunkt der Originaldateien, nicht den Zeitpunkt der Erstellung der Kopie.

Gelöst?

Bei Verwendung von cp wird eine Kopie als neue Datei betrachtet und erhält die Erstellungszeit bei Abschluss des Kopiervorgangs. Also schnell ein Shellscript verfasst, das die Dateien in der gewünschten Reihenfolge kopiert.
Zunächst schien alles wie gewünscht zu funktionieren. Jedoch beim späteren Anhängen einer weiteren Datei wurde diese zwar abgespielt - nur nicht wie gewünscht am Ende. Allerdings: meistens klappte es, nur eben nicht immer.
Das Shellscript wurde so erweitert, dass es den Speicher im MP3-Player (oder den Stick, oder die Karte) komplett löschte und dann alles erneut kopierte. Es funktionierte immer, nur war ich mit dieser Lösung nicht so richtig glücklich.

Gelöst!

Bis ich bemerkte, wann genau eine anzuhängende Datei nicht ans Ende wollte. Nämlich dann, wenn ich vorher eine nicht mehr benötigte Datei löschte. Dann trat die nächste Datei an diese Stelle, und da kam die Klarheit ...
Zunächst ist zu bemerken, dass zu Folder (oder Ordner) früher Directory gesagt wurde, zu Deutsch: Verzeichnis. Und das ist absolut richtig, denn ein Ordner ist selbst eine Datei, in der die (eigentlichen) Dateien verzeichnet sind.
Wer das Shellscriptbuch hat: siehe Seite 89, Abschnitt Die Verzeichnisstruktur
Das kann man sich wie eine Liste vorstellen:
  1. Titel01.mp3
  2. Titel02.mp3
  3. Titel03.mp3
Löscht man Titel02.mp3, wird die Stelle im Verzeichnis geleert, bleibt aber u.U. erhalten:
  1. Titel01.mp3
  2. Titel03.mp3
Kopiert man nun Titel04.mp3 in den Ordner, landet der unter Umständen auf der nächsten freien Stelle:
  1. Titel01.mp3
  2. Titel04.mp3
  3. Titel03.mp3
Die nächste Datei würde wieder brav am Ende landen.

Hilfsmittel

Die Frage war zunächst, wie bekomme ich Dateien genau in der Reihenfolge angezeigt, wie sie verzeichnet sind?
Ein fast vergessenes Feature von ls half weiter, nämlich die Option -f.
Im Manual findet man diese Erklärung (Auszug aus man ls):
... 
SYNOPSIS
       ls [OPTION]... [FILE]...

DESCRIPTION
       List  information about the FILEs (the current directory by default).  
       Sort entries alphabetically if none of -cftuvSUX nor --sort.
...
 -f     do not sort, enable -aU, disable -ls --color
...
Und aus do not sort kann man schlussfolgern: Zeige so an wie physisch abgespeichert.
Nun war es möglich, die wirkliche Reihenfolge der Musikstücke zu erkennen, wie sie der MP3-Player abspielt. Nach einigen Versuchen zeigte sich, dass Zeitstempel und Dateiname dem Player schnurzegal sind.
Zu beachten:
Die Option -f zeigte sich ein bisschen zickig. Um eine spaltenweise Ausgabe zu erhalten, musste ich tippen:
ls -f -1
Ein (normalerweise problemloses) Zusammenziehen zu
ls -f1
brachte ein anderes Ergebnis.

Screenshots

Dateien auf einem Stick:
$ ls -l --time-style=posix-long-iso  E\:/ | cut -d' ' -f6-
2016-12-05 09:52 BackDown.mp3
2017-01-08 10:49 CATAHOULA.mp3
2015-09-23 08:41 PicnicPolka.mp3
2009-12-31 23:13 WakaWaka2010.mp3
Mit ls werden Dateien nach Namen sortiert angezeigt.
Hinter E\:/ verbirgt sich lediglich der Zugriff auf den Stick.
Der Ausdruck --time-style=posix-long-iso sorgt für eine vollständige Anzeige des Zeitstempels.
Die Umleitung am Ende : | cut -d' ' -f6- schneidet nur die uninteressanten Zeilenanfänge weg.
Sortierung nach Erstellungszeit:
$ ls -ltc --time-style=posix-long-iso  E\:/ | cut -d' ' -f6-
2017-01-08 10:49 CATAHOULA.mp3
2016-12-05 09:52 BackDown.mp3
2015-09-23 08:41 PicnicPolka.mp3
2009-12-31 23:13 WakaWaka2010.mp3
Das bewirken die Optionen -tc. (Bei den verwendeten Dateien waren Erstellungszeit und Zeit der letzten Änderung identisch.)
Tatsächliche Reihenfolge, wie sie der MP3-Player wiedergibt:
$ ls -f -l --time-style=posix-long-iso  E\:/ | cut -d' ' -f6-
2015-09-23 08:41 PicnicPolka.mp3
2017-01-08 10:49 CATAHOULA.mp3
2016-12-05 09:52 BackDown.mp3
2009-12-31 23:13 WakaWaka2010.mp3
Das bewirkt die Option -f, am besten als erste Option und separat notieren wie im Beispiel. Die Reihenfolge ist genau die Folge, in der die Dateien auf den Stick kopiert wurden.