Почему команда `ls` сортирует файлы именно так?

Почему команда `ls` сортирует файлы именно так?

Когда я пытался провести обратную разработку команды 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.

Связанный контент