como o comentário do cyrus sugeriu, o motivo são as regras de agrupamento (= comparação de cadeia de caracteres com reconhecimento de localidade). No seu caso, com a maioria das localidades não C / POSIX (por exemplo, 'en_US.UTF-8'), os caracteres de espaço são ignorados ao comparar strings, portanto, "Ix" e "I x" são avaliados como iguais e, como resultado, "II" vem antes de "Ix".
Veja o seguinte:
$ touch I "I x" "Ix" "II" IIx "II x"
Ao usar uma localidade diferente de C, muitas vezes os espaços são ignorados ao comparar strings:
$ locale | grep LANG
LANG=en_US.UTF-8
LANGUAGE=en_US
$ ls -lhog
total 0
-rw-rw-r-- 1 0 Dec 26 17:12 I
-rw-rw-r-- 1 0 Dec 26 17:12 II
-rw-rw-r-- 1 0 Dec 26 17:12 IIx
-rw-rw-r-- 1 0 Dec 26 17:12 II x
-rw-rw-r-- 1 0 Dec 26 17:12 Ix
-rw-rw-r-- 1 0 Dec 26 17:12 I x
Forçando um código de idioma POSIX / C, os nomes de arquivos são comparados por caracteres ASCII, portanto, os caracteres 'space' vêm antes de 'x' ou 'I':
$ LC_ALL=C ls -lhog
total 0
-rw-rw-r-- 1 0 Dec 26 17:12 I
-rw-rw-r-- 1 0 Dec 26 17:12 I x
-rw-rw-r-- 1 0 Dec 26 17:12 II
-rw-rw-r-- 1 0 Dec 26 17:12 II x
-rw-rw-r-- 1 0 Dec 26 17:12 IIx
-rw-rw-r-- 1 0 Dec 26 17:12 Ix
Para ver os resultados reais da função de comparação ( strcoll(3)
), use ltrace
da seguinte forma:
$ LC_ALL=C ltrace -e strcoll ls -lhog
ls->strcoll("I", "II x") = -73
ls->strcoll("Ix", "I") = 120
ls->strcoll("Ix", "II x") = 47
ls->strcoll("I x", "II") = -41
ls->strcoll("IIx", "I x") = 41
ls->strcoll("IIx", "II") = 120
ls->strcoll("I x", "I") = 32
ls->strcoll("I x", "II x") = -41
ls->strcoll("II", "II x") = -32
ls->strcoll("IIx", "II x") = 88
ls->strcoll("IIx", "Ix") = -47
total 0
-rw-rw-r-- 1 0 Dec 26 17:12 I
-rw-rw-r-- 1 0 Dec 26 17:12 I x
-rw-rw-r-- 1 0 Dec 26 17:12 II
-rw-rw-r-- 1 0 Dec 26 17:12 II x
-rw-rw-r-- 1 0 Dec 26 17:12 IIx
-rw-rw-r-- 1 0 Dec 26 17:12 Ix
+++ exited (status 0) +++
$ LC_ALL=en_US.UTF-8 ltrace -e strcoll ls -lhog
ls->strcoll("I", "II x") = -1
ls->strcoll("Ix", "I") = 1
ls->strcoll("Ix", "II x") = 15
ls->strcoll("I x", "II") = 15
ls->strcoll("IIx", "II") = 1
ls->strcoll("IIx", "I x") = -15
ls->strcoll("II", "I") = 1
ls->strcoll("II", "II x") = -1
ls->strcoll("IIx", "II x") = -1
ls->strcoll("I x", "II x") = 15
ls->strcoll("I x", "Ix") = 1
total 0
-rw-rw-r-- 1 0 Dec 26 17:12 I
-rw-rw-r-- 1 0 Dec 26 17:12 II
-rw-rw-r-- 1 0 Dec 26 17:12 IIx
-rw-rw-r-- 1 0 Dec 26 17:12 II x
-rw-rw-r-- 1 0 Dec 26 17:12 Ix
-rw-rw-r-- 1 0 Dec 26 17:12 I x
+++ exited (status 0) +++