- Ao tentar ordenar arquivos de foto em ordem alfabética, o resultado da ordenação difere entre o sistema operacional e o gerenciador de arquivos
- No Linux,
ls ordena corretamente, mas a maioria dos gerenciadores de arquivos com GUI, como Windows, Google Drive e KDE Dolphin, aplica "ordenação natural (natural sort)", interpretando nomes de arquivo com números de forma numérica
- Por causa disso,
file-10.txt pode vir antes de file-9.txt, gerando um resultado diferente da ordenação tradicional por strings
- A causa real do problema foi que os dois celulares usavam convenções diferentes para nomes de arquivo: um colocava milissegundos logo após os segundos, enquanto o outro separava com underscore, mudando o critério de ordenação
- No fim, a solução é apenas padronizar a convenção de nomes de arquivo ou ajustar configurações ocultas de cada gerenciador de arquivos, e o autor lamenta “a era em que o computador prioriza adivinhar a intenção do usuário em vez de seguir a instrução”
Contexto e situação do problema
- O autor fez uma trilha com o pai, tirou fotos com os respectivos celulares Android e depois salvou todas em uma única pasta
- O padrão dos nomes das fotos era
IMG_YYYYMMDD_HHmmss ou esse formato seguido de números adicionais e .jpg
- Como esses nomes seguem a ordem de ano, mês, dia e horário, ele presumiu que ordenar os arquivos em ordem alfabética (lexicográfica) os colocaria em ordem cronológica de captura
- Ao usar Windows PC, Google Drive, KDE Dolphin etc., arquivos com o mesmo padrão não apareciam ordenados corretamente
- Ex.: uma foto tirada às 5:54 no celular do pai aparecia antes de uma foto das 9:20 e depois de uma das 12:11, entre outros casos de ordenação incorreta
- O mesmo resultado aparecia no Gnome e em outros gerenciadores de arquivos no smartphone
- No comando
ls do Linux, porém, a ordem era mantida corretamente, aumentando a confusão
Análise da causa
- No começo, ele pensou que um dos celulares talvez estivesse usando um caractere estranho no lugar do underscore (_), mas ao verificar com o comando
ls no Linux, a ordenação estava normal
- Em várias distribuições Linux e até em um servidor OpenBSD, o
ls ordenava corretamente em ordem alfabética
- Em contraste, muitos gerenciadores de arquivos com GUI (Windows, Google Drive, KDE Dolphin etc.) comparam os números no nome do arquivo pelo valor numérico real
- Ou seja, aplicam por padrão ordenação natural (natural sorting) em vez de ordem alfabética
- Na ordenação natural, números dentro de strings são comparados não como caracteres isolados, mas como valores numéricos
- Ex.:
file-9.txt < file-10.txt → ordem que parece natural para humanos
- Já na ordenação tradicional, como
1 < 9, file-10.txt viria antes
- Porém, os gerenciadores modernos, quando encontram uma “parte numérica”, interpretam esse trecho como o valor real do número e forçam 9 a vir antes de 10
- Isso pode divergir da ordem que o usuário pretendia ao criar os nomes dos arquivos
Causa real do problema e solução
- O celular do pai colocava os milissegundos imediatamente após os segundos, enquanto o do autor separava com underscore
- Celular do pai: anexa os milissegundos diretamente após os segundos → o número fica maior e vai mais para o fim
- Celular do autor: usa underscore para separar → é tratado como uma string distinta
- Solução: reorganizar os nomes de arquivo de um dos lados para um padrão consistente resolve o problema
- No KDE Dolphin, é possível escolher a ordenação puramente alfabética nas opções, mas a configuração fica escondida e é incômoda de ajustar
- Como os recursos variam entre programas, pode ser necessário configurar isso separadamente em cada um
Conclusão do autor
- Mesmo tendo especificado “ordem alfabética”, ele critica o fato de o software tentar adivinhar a intenção do usuário e aplicar outra ordenação
- Há saudade de um jeito mais simples, como antigamente, em que o computador fazia apenas o que foi mandado
1 comentários
Opinião do Hacker News
Acho que a forma de ordenação adotada por Microsoft, Google e KDE cobre casos mais intuitivos e mais comuns, e que a situação do autor é extremamente rara; parece que a maioria das pessoas prefere muito mais que “10” venha depois de “9”; como ambientes desktop exibem a ordenação como “por nome”, e não “alfabética”, não há mal-entendido; não gosto quando o computador tenta adivinhar a intenção, mas isso também é útil na vida real, como o salvamento automático; seria bom ter uma opção de ordenação realmente alfabética, mas faz sentido que o padrão seja o caso mais universal e intuitivo
Esse tema me lembra o debate de “Worse is better”; a ordenação simples baseada em ANSI/Unicode que o autor quer é, na verdade, uma função que só uma minoria de desenvolvedores precisa; na prática, 99% dos usuários de GUI querem uma ordenação intuitiva; identificar o público principal afeta enormemente o design do produto; uma função melhor pode combinar com um produto, mas para um sistema a simplicidade pode ser mais adequada para crescimento e evolução
Ao procurar arquivos nomeados com hash, a ordenação automática é a coisa mais incômoda; no Windows, é uma das poucas opções que eu desativo direto pelo registro; sinto falta dos tempos em que o computador apenas fazia o que mandavam; hoje parece menos “ler a mente do usuário” e mais “tentar mudar até o pensamento”, e isso me incomoda; tenho aversão a essa mentalidade dogmática de que “o usuário está errado”, inclusive no open source
Todo mundo diz saber quais são as necessidades do usuário médio, então por que ninguém sugere que o computador simplesmente renomeie automaticamente os arquivos como quiser? Se não vamos impor a ordenação ASCII, também não há motivo para ficar preso a nomes de arquivo com extensão incluída; na prática, o usuário não liga para extensões como jpg ou png, nem para diferenciação entre maiúsculas e minúsculas; em sistemas da família Windows, extensões foram muito usadas por causa de compatibilidade antiga; é estranho impor “nomes de arquivo ao estilo do computador” e ao mesmo tempo insistir em quebrar só a “ordenação ao estilo do computador”; como não dá para saber exatamente o que o usuário quer, não se deve presumir
Para mim, na maioria dos casos essa ordenação baseada em versão descrita no artigo é melhor; mostrar em ordem alfabética chega a parecer um bug; o problema não é o conceito de ordenação, e sim o rótulo
sortno Linux hoje também suporta ordenação por versão (sort -V); não conheço os detalhes internos, mas funciona bem na maioria dos casos e, acima de tudo, é fácil ligar ou desligarA instrução não é ordenar arquivos “alfabeticamente”, mas ordenar “por nome”, então a interpretação pode variar de um sistema operacional para outro; acho que foi escolhida, com base em lógica e dados, a interpretação mais adequada para a maioria dos usuários; talvez no futuro surjam regras como usar a ordem alfabética original quando grupos numéricos tiverem zero à esquerda, ou talvez apareça uma opção de escolha do usuário
No Foundation do macOS,
NSString.localizedStandardCompare()é fornecido oficialmente para a ordenação usada pelo Finder; o Windows também ofereceStrCompareLogical, ou seja, cada plataforma está formalizando esse critério de ordenação por nome, isto é, ordenação naturalls, e agora passei a achar esse método melhor; em apps de fotos, normalmente eu ordenaria por timestamp, e se eu realmente precisasse de ordenação estrita por nome, ordenaria por data de criação ou normalizaria manualmente os nomes dos arquivosO relatório do Unicode menciona claramente que o modo de ordenação varia por idioma e contexto; por exemplo, se “A-10” for ordenado alfabeticamente sem reconhecer números, “A-10” virá antes de “A-2”; é complexo, mas acho que é por isso que navegadores de arquivos escolheram a ordenação natural
Fazer “foo9” vir antes de “foo10” é justamente “natural sort”; recentemente descobri uma forma de fazer ordenação natural em Python com duas linhas de código e fiquei muito satisfeito; recomendo este código relacionado no Stack Overflow
sort(1)também suporta ordenação natural (-V); se você criar arquivos de imagem e usarls | sort -V, funciona corretamente; a saída dedu -sh *também pode ser ordenada com a opçãosort -hNão sinto falta da ordenação que misturava coisas como “Image-1.jpg, Image-11.jpg, Image-2.jpg”; lembro que a ordenação natural já me pareceu estranha, mas quando o Windows passou a ordenar pelo valor numérico ficou realmente muito mais confortável; os arquivos passaram a ficar em uma ordem natural e isso me agradou bastante