При сортировке имен файлов ls
игнорирует такие символы, как -,_
. Я ожидал, что он будет использовать эти символы в сортировке.
Пример:
touch a1 a2 a-1 a-2 a_1 a_2 a.1 a.2 a,1 a,2
Теперь отобразите эти файлы с помощью ls -1
:
a1
a_1
a-1
a,1
a.1
a2
a_2
a-2
a,2
a.2
То, что я ожидал, было что-то вроде этого:
a1
a2
a,1
a,2
a.1
a.2
a_1
a_2
a-1
a-2
т.е. я ожидал, что при сортировке будут учитываться не алфавитно-цифровые символы.
Кто-нибудь может объяснить это поведение? Это поведение предписано стандартом? Или это связано с кодировкой UTF-8?
Обновление: Похоже, это связано с сортировкой UTF-8:
$ LC_COLLATE=C ls -1
a,1
a,2
a-1
a-2
a.1
a.2
a1
a2
a_1
a_2
LC_COLLATE=C ls
?[_-,.]
они группируются и почему-то почти игнорируются. Я не знаю точно , как или где определяется такая сверка, но это должно быть проблемой сортировки, так просто, и только, изменяя параметры сортировки на C (черезLC_COLLATE=C ls -l
) достаточно , чтобы дать вам порядок сортировки вы ожидали (при условии ,LC_ALL
является не переопределятьLC_COLLATE
). Это относится ко всему диапазону символов в базовой многоязычной плоскости Unicode ... Я отредактировал свой ответ, включив в него пример сценария, который это подтверждает ...Ответы:
Это не имеет ничего общего с кодировкой. Скорее, именно язык определяет порядок сопоставления. Libc проверяет язык, представленный в
$LC_COLLATE
/$LC_ALL
/,$LANG
и ищет правила сопоставления (например,/usr/share/i18n/locales/*
для GLibC) и упорядочивает текст в соответствии с указаниями.источник
strcoll
например, вы бы увидели, что что-то вродеaasa.c
будет отсортировано вышеaas.c
.РЕДАКТИРОВАТЬ: Добавлен тест для данных, отсортированных с LC_COLLATE = C
Последовательность сортировки по умолчанию обрабатывает эти символы «типа пунктуации» как имеющие одинаковое значение ..
Use LC_COLLATE=C
для обработки их в порядке кодировки.Выход
В следующем коде проверяются все действительные символы UTF-8 в базовой многоязычной плоскости (за исключением \ x00 и \ x0a ; для простоты).
Он сравнивает файл в известной (сгенерированной) возрастающей последовательности с этим файлом, случайно отсортированным, а затем снова сортируется с LC_COLLATE = С. Результат показывает, что последовательность C идентична исходной сгенерированной последовательности.
Выход:
источник
a_1 a2 a_2
был бы невозможен.tree
как это происходит, я думаю, что в истории есть нечто большее, например, удаление знаков препинания из строк сравнения или что-то в этом роде. Я могу сказать, что/
символ должен быть установлен как самый низкий символ в последовательности сортировки, независимо от того, что еще.