- Beim Versuch, Bilddateien alphabetisch zu sortieren, stellte sich heraus, dass Betriebssysteme und Dateimanager unterschiedlich sortieren
- Unter Linux werden sie mit
ls korrekt sortiert, aber die meisten GUI-Dateimanager wie Windows, Google Drive und KDE Dolphin wenden bei Dateinamen mit Zahlen eine numerische Interpretation als „Natural Sort“ an
- Dadurch kommt es zu anderen Ergebnissen als bei der klassischen Zeichenketten-Sortierung, etwa dass
file-10.txt vor file-9.txt erscheint
- Die eigentliche Ursache des Problems war, dass zwei Handys unterschiedliche Dateinamenskonventionen verwendeten: Eines hängte Millisekunden direkt an die Sekunden an, das andere trennte sie mit einem Unterstrich
- Letztlich bleibt als Lösung nur, die Dateinamenskonvention zu vereinheitlichen oder versteckte Einstellungen der jeweiligen Dateimanager anzupassen; der Autor bedauert, dass „Computer heute Vermutungen über die Absicht des Nutzers über dessen Anweisungen stellen“
Hintergrund und Problemsituation
- Der Autor war mit seinem Vater wandern, machte mit den jeweiligen Android-Smartphones Fotos und speicherte alle Bilder in einem einzigen Ordner
- Das Namensschema der Bilddateien ist
IMG_YYYYMMDD_HHmmss oder zusätzlich mit weiteren Ziffern vor .jpg
- Da diese Dateinamen nach Jahr, Monat, Tag und Uhrzeit aufgebaut sind, lag die Annahme nahe, dass eine alphabetische (lexikografische) Sortierung automatisch auch der Aufnahmezeit entspricht
- Beim Einsatz eines Windows-PCs, von Google Drive und KDE Dolphin zeigte sich jedoch, dass Dateien mit demselben Schema nicht in der erwarteten Reihenfolge sortiert wurden
- Beispiel: Ein um 5:54 aufgenommenes Bild vom Handy des Vaters erschien vor einem Foto von 9:20 und sogar nach einem Bild von 12:11 – die Reihenfolge war also offensichtlich falsch
- Auch Gnome und andere Dateimanager auf dem Smartphone zeigten dasselbe Ergebnis
- Der Linux-Befehl
ls hielt dagegen die korrekte Reihenfolge ein, was die Verwirrung noch vergrößerte
Ursachenanalyse
- Zunächst vermutete der Autor, eines der beiden Handys habe vielleicht ein ungewöhnliches Zeichen statt eines Unterstrichs (_) verwendet; mit dem Linux-Befehl
ls zeigte sich jedoch eine korrekte Sortierung
- Auch auf verschiedenen Linux-Distributionen und sogar auf einem OpenBSD-Server sortierte
ls korrekt alphabetisch
- Im Gegensatz dazu vergleichen viele GUI-Dateimanager (Windows, Google Drive, KDE Dolphin usw.) bei Dateinamen mit Zahlen nach dem tatsächlichen Zahlenwert
- Statt alphabetischer Reihenfolge wird also standardmäßig Natural Sorting verwendet
- Beim Natural Sort werden Zahlen in Zeichenketten nicht nach ihrem Zeichenwert, sondern nach ihrem numerischen Wert verglichen
- Beispiel:
file-9.txt < file-10.txt → die Reihenfolge, die Menschen meist erwarten
- Bei traditioneller Sortierung gilt dagegen
1 < 9, sodass file-10.txt zuerst käme
- Moderne Dateimanager interpretieren also bei einem „Zahlenblock“ diesen Teil als echte Zahl und erzwingen dadurch, dass 9 vor 10 kommt
- Das kann von der vom Nutzer beabsichtigten Reihenfolge abweichen
Tatsächliche Ursache und Lösung
- Das Handy des Vaters hängte die Millisekunden direkt an die Sekunden an, während das eigene Handy sie mit einem Unterstrich getrennt schrieb
- Handy des Vaters: Millisekunden direkt nach den Sekunden → die Zahl wird größer und in der Sortierung weiter nach hinten geschoben
- Eigenes Handy: Trennung per Unterstrich → wird als separater String behandelt
- Lösung: Die Dateinamen einer der beiden Seiten auf ein einheitliches Muster bringen, dann verschwindet das Problem
- In KDE Dolphin lässt sich per Option eine rein alphabetische Sortierung auswählen, die Einstellung ist jedoch versteckt und damit umständlich zu finden
- Da Programme diese Funktion unterschiedlich handhaben, kann jedes Mal eine separate Konfiguration nötig sein
Fazit des Autors
- Obwohl ausdrücklich „alphabetische Reihenfolge“ gewählt wurde, kritisiert der Autor, dass Software die Absicht des Nutzers errät und deshalb eine andere Sortierung anwendet
- Er vermisst die frühere schlichte Funktionsweise, bei der Computer einfach genau das taten, was man ihnen sagte
1 Kommentare
Hacker-News-Kommentare
Ich denke, dass die von Microsoft, Google und KDE übernommene Sortierweise intuitiver ist und die häufiger vorkommenden Fälle abdeckt; die Situation des Autors halte ich für äußerst selten. Die meisten Menschen möchten viel eher, dass „10“ nach „9“ kommt. Desktop-Umgebungen bezeichnen die Sortierung zudem nicht als „alphabetisch“, sondern als „nach Namen“, daher gibt es kein Missverständnis. Ich mag es zwar nicht, wenn der Computer versucht, Absichten zu erraten, aber so etwas ist im Alltag nützlich, ähnlich wie Autosave. Eine echte alphabetische Sortieroption wäre schön, aber als Standard ist eine für allgemeine Fälle intuitive Voreinstellung richtig.
Dieses Thema erinnert mich an die Debatte „Worse is better“. Die vom Autor geforderte einfache ANSI-/Unicode-basierte Sortierung ist eher eine Funktion, die nur eine kleine Minderheit von Entwicklern braucht. Tatsächlich wollen 99 % der GUI-Nutzer eine intuitive Sortierung. Die Hauptzielgruppe zu verstehen, hat enormen Einfluss auf das Produktdesign. Bessere Funktionen können zu einem Produkt passen, aber für ein System kann Einfachheit besser zu Wachstum und Evolution passen.
Beim Suchen nach Dateien mit hashbasierten Namen ist automatische Sortierung am lästigsten. Unter Windows ist das eine der wenigen Optionen, die ich sofort per Registry abschalte. Ich vermisse oft die Zeiten, in denen Computer einfach genau das taten, was man ihnen sagte. Heute wirkt es weniger so, als wollten sie „die Gedanken des Nutzers lesen“, sondern eher so, als wollten sie diese Gedanken gleich umformen. Diese dogmatische Haltung, der Nutzer liege falsch, stört mich, auch in Open Source.
Wenn ohnehin alle behaupten, die Bedürfnisse des Durchschnittsnutzers zu kennen, warum schlägt dann niemand vor, dass der Computer gleich auch Dateinamen selbstständig nach Belieben ändern soll? Wenn man keine ASCII-Sortierung erzwingt, muss man sich auch nicht an Dateinamen inklusive Erweiterung klammern. In Wirklichkeit sind jpg- oder png-Erweiterungen den Nutzern meist egal, ebenso die Groß-/Kleinschreibung. Gerade in der Windows-Welt wurden Erweiterungen oft nur wegen alter Kompatibilität verwendet. Warum erzwingt man also weiter „computerartige Dateinamen“, bricht aber ausgerechnet „computerartige Sortierung“ so hartnäckig auf? Man sollte keine festen Annahmen darüber treffen, was Nutzer wollen, wenn man es gar nicht wissen kann.
Ich finde meist die im Artikel beschriebene versionsbasierte Sortierung besser. Eine alphabetische Anzeige wirkt für mich fast wie ein Bug. Ich denke, das Problem liegt weniger im Sortierkonzept als in der Bezeichnung.
sortunterstützt heute Versionssortierung (sort -V). Ich kenne die interne Umsetzung nicht, aber in den meisten Situationen funktioniert das gut. Vor allem lässt es sich leicht ein- und ausschalten.Man weist den Computer nicht an, „alphabetisch“ zu sortieren, sondern „nach Namen“, daher kann die Interpretation je nach OS unterschiedlich ausfallen. Ich denke, man hat anhand von Logik und Daten die für die meisten Nutzer passendere Interpretation gewählt. Vielleicht kommen in Zukunft Regeln dazu, etwa dass bei Zahlengruppen mit führenden Nullen wieder die ursprüngliche alphabetische Sortierung verwendet wird, oder es gibt eine Nutzeroption.
In macOS Foundation wird mit
NSString.localizedStandardCompare()offiziell genau die Finder-Sortierung bereitgestellt. Auch Windows bietetStrCompareLogicalan. Das heißt, der Maßstab für Sortierung nach Namen, also Natural Sort, wird auf den Plattformen offiziell festgelegt.lsunterscheiden würde, und inzwischen halte ich diese Methode auch für besser. In Foto-Apps sortiert man normalerweise nach Zeitstempel, und wenn wirklich eine Sortierung strikt nach Namen nötig ist, würde ich entweder nach Erstellungsdatum sortieren oder die Dateinamen direkt selbst normalisieren.Der Unicode-Bericht erwähnt ausdrücklich, dass sich Sortierweisen je nach Sprache und Kontext unterscheiden. Beispiel: Wenn man „A-10“ alphabetisch sortiert, ohne Zahlen als Zahlen zu erkennen, kommt „A-10“ vor „A-2“. Es ist kompliziert, aber ich denke, genau deshalb haben Dateibrowser zu Recht Natural Sort gewählt.
Dass „foo9“ vor „foo10“ einsortiert wird, ist „natural sort“. Ich habe kürzlich eine Python-Lösung mit zwei Zeilen für Natural Sorting kennengelernt und war sehr zufrieden damit; ich empfehle den zugehörigen Stack-Overflow-Code.
sort(1)unterstützt Natural Sorting (-V). Wenn man Bilddateien erstellt und mitls | sort -Vsortiert, funktioniert das korrekt. Auch die Ausgabe vondu -sh *lässt sich mit der Optionsort -hsortieren.Ich vermisse keine Sortierung, bei der Dinge wie „Image-1.jpg, Image-11.jpg, Image-2.jpg“ durcheinandergeraten. Ich erinnere mich zwar, dass sich Natural Sort früher ungewohnt anfühlte, aber als Windows auf numerische Sortierung umgestellt hat, war das wirklich praktisch. Die Dateien wurden natürlich sortiert, und ich war damit sehr zufrieden.