- En voulant trier des fichiers photo par ordre alphabétique, l’auteur a constaté que le système d’exploitation et le gestionnaire de fichiers n’obtenaient pas le même résultat de tri
- Dans
ls sous Linux, le tri se fait correctement, mais la plupart des gestionnaires de fichiers GUI comme Windows, Google Drive ou KDE Dolphin appliquent un « tri naturel » (natural sort) qui interprète numériquement les noms de fichiers contenant des chiffres
- Cela produit donc des résultats différents du tri lexicographique traditionnel, par exemple
file-10.txt peut se retrouver avant file-9.txt
- La véritable cause du problème était que les deux téléphones utilisaient des conventions de nommage différentes : l’un ajoutait directement les millisecondes après les secondes, tandis que l’autre les séparait par un underscore
- Au final, la seule solution est d’uniformiser la convention de nommage des fichiers ou de modifier les réglages cachés de chaque gestionnaire de fichiers ; l’auteur regrette une époque où « les ordinateurs exécutaient les instructions de l’utilisateur au lieu de privilégier leurs suppositions »
Contexte et situation du problème
- L’auteur faisait une randonnée avec son père, chacun prenant des photos avec son téléphone Android, puis toutes les photos ont été placées dans un même dossier
- La convention des noms de fichiers photo était
IMG_YYYYMMDD_HHmmss ou cette chaîne suivie de chiffres supplémentaires puis de .jpg
- Comme ce format encode l’année, le mois, le jour et l’heure dans cet ordre, il semblait logique que trier les fichiers par ordre alphabétique (lexicographique) les classe aussi par heure de prise de vue
- En utilisant un PC Windows, Google Drive, KDE Dolphin, etc., les fichiers suivant pourtant la même convention n’étaient pas triés dans le bon ordre
- Exemple : une photo prise à 5:54 avec le téléphone du père apparaissait avant une photo de 9:20, puis se retrouvait après une photo de 12:11, bref l’ordre était incorrect
- Gnome et d’autres gestionnaires de fichiers sur smartphone donnaient le même résultat
- La commande
ls sous Linux, elle, conservait l’ordre attendu, ce qui renforçait la confusion
Analyse de la cause
- Au départ, l’auteur pensait que l’un des deux téléphones utilisait un caractère étrange à la place de l’underscore (_), mais une vérification avec la commande Linux
ls montrait un tri normal
- Sur différentes distributions Linux ainsi que sur un serveur OpenBSD,
ls triait bien par ordre alphabétique
- En revanche, de nombreux gestionnaires de fichiers GUI (Windows, Google Drive, KDE Dolphin, etc.) comparent la valeur réelle des nombres lorsqu’un nom de fichier contient des chiffres
- Ils appliquent donc par défaut un tri naturel (natural sorting) plutôt qu’un tri alphabétique strict
- Le tri naturel compare les chiffres présents dans une chaîne comme des valeurs numériques, et non comme de simples caractères
- Exemple :
file-9.txt < file-10.txt → l’ordre que les humains attendent généralement
- Mais dans un tri traditionnel,
1 < 9, donc file-10.txt passe avant file-9.txt
- Pourtant, les gestionnaires de fichiers actuels, dès qu’ils détectent une « partie numérique », forcent un tri selon la valeur réelle de ce nombre, plaçant 9 avant 10
- Ce comportement peut donc contredire l’ordre voulu par la personne qui a créé les noms de fichiers
Véritable cause du problème et solution
- Le téléphone du père ajoutait les millisecondes directement après les secondes, tandis que celui de l’auteur les séparait par un underscore
- Téléphone du père : millisecondes collées juste après les secondes → le nombre devient plus grand et est repoussé plus loin dans le tri
- Téléphone de l’auteur : séparation par underscore → traité comme une autre sous-chaîne
- Solution : renommer les fichiers d’un des deux appareils selon un motif cohérent permet de régler le problème
- Dans le cas de KDE Dolphin, il est possible de choisir un tri purement alphabétique dans les options, mais le réglage est caché, ce qui le rend peu pratique
- Comme les fonctionnalités varient selon les logiciels, il peut être nécessaire de configurer chaque programme séparément
Conclusion de l’auteur
- L’auteur critique le fait que, même lorsqu’on demande un « ordre alphabétique », le logiciel tente d’interpréter l’intention de l’utilisateur et applique un autre type de tri
- Il regrette la simplicité d’autrefois, quand les ordinateurs se contentaient d’exécuter exactement ce qu’on leur demandait
1 commentaires
Avis Hacker News
Je pense que le mode de tri adopté par Microsoft, Google et KDE couvre des cas plus intuitifs et plus courants, et que la situation de l’auteur est extrêmement rare ; la plupart des gens veulent bien plus souvent que « 10 » arrive après « 9 », les environnements de bureau parlent d’un tri « par nom » et non « alphabétique », donc il n’y a pas de malentendu ; je n’aime pas trop quand l’ordinateur essaie de deviner l’intention, mais comme la sauvegarde automatique ce genre de chose est utile dans la vie réelle ; ce serait bien d’avoir aussi une vraie option de tri alphabétique strict, mais par défaut il est logique que le cas général le plus intuitif prime
Ce sujet me rappelle le débat « Worse is better » ; le mode de tri simple basé sur ANSI/Unicode demandé par l’auteur est au contraire une fonction dont seule une minorité de développeurs a besoin ; en pratique, 99 % des utilisateurs de GUI veulent un tri intuitif ; identifier l’utilisateur principal a un impact énorme sur la conception d’un produit ; une fonction plus avancée peut convenir à un produit, mais pour un système la simplicité peut être plus adaptée à la croissance et à l’évolution
Le tri automatique est ce qu’il y a de plus agaçant quand on cherche des fichiers nommés avec des hash ; sous Windows, c’est l’une des rares options que je désactive immédiatement via le registre ; il me manque souvent l’époque où l’ordinateur faisait simplement ce qu’on lui demandait ; aujourd’hui j’ai l’impression qu’il ne cherche plus seulement à « lire dans l’esprit de l’utilisateur », mais à changer sa façon de penser, et ça me rebute ; même dans l’open source, je n’aime pas cette mentalité autoritaire qui dit que « l’utilisateur a tort »
Puisque tout le monde prétend connaître les besoins de l’utilisateur moyen, je me demande pourquoi personne ne propose que l’ordinateur modifie aussi automatiquement les noms de fichiers eux-mêmes à sa guise ; si on ne veut pas imposer le tri ASCII, rien n’oblige non plus à rester attaché aux noms incluant une extension ; en réalité, l’utilisateur ne se soucie pas des extensions jpg ou png, ni de la casse ; c’est surtout dans l’univers Windows que les extensions ont longtemps été utilisées pour des raisons de compatibilité ancienne ; on impose des « noms de fichiers à la manière des ordinateurs », alors pourquoi s’acharner uniquement à casser le « tri à la manière des ordinateurs » ? Comme on ne peut pas savoir avec certitude ce que veulent les utilisateurs, il ne faut pas l’affirmer trop vite
Personnellement, je préfère dans la plupart des cas le tri basé sur les versions décrit dans l’article ; voir un affichage en ordre alphabétique me donne presque l’impression d’un bug ; pour moi, le problème n’est pas le concept de tri, mais l’étiquetage
sortde Linux prend aussi en charge aujourd’hui le tri par version (sort -V) ; je ne connais pas son fonctionnement interne, mais dans la plupart des situations cela marche bien, et surtout on peut l’activer ou le désactiver facilementOn ne donne pas l’ordre de trier les fichiers « alphabétiquement », on demande un tri « par nom », donc l’interprétation peut varier selon l’OS ; je pense qu’ils ont choisi, sur la base de la logique et des données, l’interprétation la plus adaptée pour la majorité des utilisateurs ; peut-être qu’à l’avenir on ajoutera une règle du type « s’il y a des 0 dans les groupes de chiffres, on revient au vrai ordre alphabétique », ou peut-être une option de choix utilisateur
Dans macOS Foundation,
NSString.localizedStandardCompare()est officiellement fourni pour le tri de Finder ; Windows fournit aussiStrCompareLogical, autrement dit chaque plateforme formalise officiellement le tri par nom, c’est-à-dire le tri naturells, et maintenant j’en suis venu à penser que cette approche est meilleure ; dans une app photo, on trie généralement par horodatage, et si un fichier a vraiment besoin d’un tri strict par nom, je trierais plutôt par date de création ou je normaliserais directement le nom du fichierUn rapport Unicode mentionne clairement que selon la langue, la méthode de tri varie avec le contexte ; par exemple, si l’on trie « A-10 » alphabétiquement sans reconnaître le nombre, « A-10 » arrive avant « A-2 » ; c’est complexe, mais je pense que c’est précisément pour cette raison que les navigateurs de fichiers ont choisi le tri naturel
Trier de façon à ce que « foo9 » vienne avant « foo10 », c’est du « natural sort » ; j’ai récemment découvert une manière de faire du tri naturel en deux lignes de Python, et j’en suis très content ; je recommande ce code Stack Overflow
sort(1)prend aussi en charge le tri naturel (-V) ; si on crée des fichiers image et qu’on les trie avecls | sort -V, cela fonctionne correctement ; on peut aussi trier la sortie dedu -sh *avec l’optionsort -hCe tri où l’on obtient quelque chose comme « Image-1.jpg, Image-11.jpg, Image-2.jpg » ne me manque pas ; je me souviens qu’au début le tri naturel me paraissait étrange, mais quand Windows est passé à un tri par valeur numérique, c’est devenu vraiment pratique ; les fichiers se mettaient dans un ordre naturel, et j’en étais très satisfait