Почему 'ls' перечисляет следующие файлы в, казалось бы, другом порядке?

Я бы начал с создания работоспособной версии rpmbuild:

  • получить исходники rpm
  • распаковать исходники с помощью unrpm, rpm2cpio и т.д.
  • просмотрите spec-файл, вручную примените исправления
  • используйте те же (или эквивалентные) configure опции, что и в %configure части spec-файла.
  • установите результат.
  • используйте эту версию rpmbuild для сборки из ее исходного-RPM.
  • установите этот rpm.

После этого вы должны быть готовы к сборке пакетов на Fedora13.

4
06.12.2016, 02:29
2 ответа

Локаль действительно сложная. Цель состоит в том, чтобы получить что-то, что "кажется нормальным" для нетехнических пользователей. (Технические специалисты могут использовать LANG = C , чтобы получить это теплое нечеткое ощущение.) Техническое определение - это стандартный документ Unicode , и я попытался выделить здесь кое-что из этого. Исправления приняты.

Мне интересно прочитать, что локаль - это свойство пользователя, обрабатывающего данные, а не самих данных. В техническом документе дается несколько подробностей, чтобы прояснить это со ссылкой на то, что порядок сортировки для немецкого пользователя отличается от порядка сортировки для шведского пользователя, даже если символы, используемые в примерах строк, совпадают.

Локали en_GB и en_US настроены так, чтобы игнорировать символ - . Очень упрощенные правила сортировки этих локалей по возрастанию:

  1. Регистр не учитывается
  2. Если у вас есть две строки, одна из которых совпадает с другой, но длиннее, сортировка выполняется вторым. Таким образом, xyzA всегда после xyz
  3. Некоторая пунктуация (в этой ситуации, включая - ) игнорируется, если не сравнивается с другой пунктуацией
  4. Цифры сортируются перед буквами
  5. Сортировка цифр 0 .. 9
  6. Сортировка букв [Aa] .. [Zz] (en_GB и en_US действительно не имеют акцентов)
  7. Пунктуация отсортирована (но это не относится к примерам в этом ответе)

Применение этих правил к рассматриваемым наборам данных:

 a_1 a_10 a_11 a_12 
 

Это эквивалентно a1 a10 a11 a12 , и, учитывая правило № 2, мы получаем, что a1 должен быть перед a10 и a11 . Все, кроме a1 , имеет одинаковое количество буквенно-цифровых символов, поэтому их можно сравнивать последовательно. Это дает нам a_1 a_10 a_11 a_12 .

 a_10-18 a_11-18 a_1-18 a_12-18 
 

Применяются те же правила, за исключением того, что также применяется пункт 3 (мы игнорируем пунктуацию). Это означает, что мы можем рассматривать значения как a_1018 a_1118 a_118 a_1218 , и, следуя правилам №2 и №4, мы получаем порядок a_10-18 а_11-18 а_1-18 а_12-18 .

Взяв наш последний пример из комментариев

 a_10 a_10- a_100 a_101 a_10-18 a_102 
 

Применяются правила №3, а затем №2, №4. Поэтому мы удаляем (игнорируем) символы - , давая нам a_10 a_10 a_100 a_101 a_1018 a_102 , а остаток сортируем по общий префикс подстроки, а затем по порядку символов.

(Мне непонятно, получим ли мы a_10 , а затем a_10- в силу длины, или просто потому, что так получилось. Я испытываю искушение чтобы предложить последнее, но я хотел бы, чтобы кто-нибудь это подтвердил.)

6
27.01.2020, 20:52

В лексикографическом порядке a_1 предшествует любой другой строке, начинающейся с a_1 . Поскольку цифры расположены в числовом порядке в любой приемлемой локали, из этого следует, что в любой разумной локали, a_1 < a_10 < a_11 < a_12 ].

Если вы добавите общий суффикс к этим строкам, порядок может измениться, потому что этот общий суффикс может быть отсортирован где-то посередине. Во втором примере четыре строки начинаются с общего префикса a_1 и с соответствующих суффиксов 0-18 , 1-18 , -18 и 2-18 . В локали C строки сравниваются на строгой лексикографической основе; - идет перед цифрами, поэтому сначала идет -18 : a_10-18 < a_11-18 < a_1-18 < а_12-18 . Но в большинстве других мест сложнее. В частности, знаки препинания игнорируются, за исключением крайних случаев. Итак, чтобы сравнить строки a_10-18 < a_11-18 < a_1-18 < a_12-18 , сначала вы сравниваете строки без пунктуации a1018 , a1118 a118 a1218 ; порядок второй цифры 0 < 1 < 1 < 2 , а для двух средних строк порядок третьей цифра 1 < 8 .Если вы добавите строку, которая отличается только знаками препинания, то разные знаки препинания будут определять способ сортировки, например a_10-18 < a_1-118 < a_11-18 < a_12-18

Объяснение в моем ответе упрощено. Может быть больше двух проходов, чтобы справиться с такими вещами, как пунктуация.В Руководстве пользователя ICU есть довольно подробное объяснение (но даже оно не учитывает всех тонкостей, связанных с сортировкой таких вещей, как указатели книг).

1
27.01.2020, 20:52

Теги

Похожие вопросы