
Когда я пытался провести обратную разработку команды ls, я столкнулся с интересным поведением. Когда я создаю 3 файла, foo.png
, foopa.png
, и fooqa.png
, ls сортирует их как foopa.png
, foo.png
, и fooqa.png
. Я также пробовал использовать расширение .gif, и, похоже, это происходит, когда p и q заменяются первой буквой расширения и следующей буквой в алфавите; так в случае .гесли бы это были g и h. ( fooga.gif
, тогда foo.gif
, тогда fooha.gif
)
Почему вывод упорядочен именно таким образом?
решение1
Это зависит от порядка сортировки в вашей локали:
>LANG=en_IE.UTF-8 ls -1 foo*
foopa.png
foo.png
fooqa.png
>LANG=C ls -1 foo*
foo.png
foopa.png
fooqa.png
Вы также можете использовать переменную LC_COLLATE вместо LANG и использовать локаль POSIX вместо C.
Порядок сортировки C является чисто алфавитным (порядок ASCII). Другие порядки сортировки (например, английский) могут рассматривать пробелы и специальные символы, такие как точки, как разделители и либо обрабатывать «слова» отдельно, либо просто игнорировать эти разделители (что, по-видимому, имеет место в данном случае).
Обратите внимание, что локаль, отличная от UTF-8, также сортирует с использованием алфавитного ASCII:
>LANG=en_IE ls -1 foo*
foo.png
foopa.png
fooqa.png
После дальнейшего изучения выяснилось, что игнорирование знаков препинания является распространенной особенностью локалей, поддерживающих Unicode, таких как эти *.UTF-8
.