Во всех оболочках глобусы сортируются по умолчанию. Они уже были /etc/glob
помощником, вызванным оболочкой Кена Томпсона, чтобы расширить глобусы в первой версии Unix в начале 70-х (и которая дала глобусам их имя).
Поскольку sh
POSIX требует, чтобы они сортировались в порядке strcoll()
, то есть с использованием порядка сортировки в локали пользователя, например, ls
хотя некоторые все еще делают это через strcmp()
, что основано только на байтовых значениях.
$ dash -c 'echo *'
Log01B log-0D log00 log01 log02 log0A log0B log0C log4E log4F log50 log① log② lóg01
$ bash -c 'echo *'
log① log② log00 log01 lóg01 Log01B log02 log0A log0B log0C log-0D log4E log4F log50
$ zsh -c 'echo *'
log① log② log00 log01 lóg01 Log01B log02 log0A log0B log0C log-0D log4E log4F log50
$ ls
log② log① log00 log01 lóg01 Log01B log02 log0A log0B log0C log-0D log4E log4F log50
$ ls | sort
log②
log①
log00
log01
lóg01
Log01B
log02
log0A
log0B
log0C
log-0D
log4E
log4F
log50
Вы можете заметить выше, что для тех оболочек, которые выполняют сортировку на основе локали, здесь, в системе GNU с en_GB.UTF-8
локалью, -
в именах файлов игнорируется для сортировки (большинство знаков препинания будет). Они ó
сортируются более ожидаемым образом (по крайней мере, для британцев), и случай игнорируется (за исключением случаев, когда речь идет о решении связей).
Однако вы заметите некоторые несоответствия для log① log①. Это потому, что порядок сортировки ① и ② не определен в локалях GNU (в настоящее время; надеюсь, он когда-нибудь будет исправлен). Они сортируют одинаково, так что вы получите случайные результаты.
Изменение языкового стандарта повлияет на порядок сортировки. Вы можете установить локаль в C, чтобы получить strcmp()
подобную сортировку:
$ bash -c 'echo *'
log① log② log00 log01 lóg01 Log01B log02 log0.2 log0A log0B log0C log-0D log4E log4F log50
$ bash -c 'LC_ALL=C; echo *'
Log01B log-0D log0.2 log00 log01 log02 log0A log0B log0C log4E log4F log50 log① log② lóg01
Обратите внимание, что некоторые локали могут вызвать некоторую путаницу даже для строк all-alnum all-ASCII. Как Чешские из них (в системах GNU , по крайней мере) , где ch
представляет собой упорядочивающий элемент , который сортирует после того, как h
:
$ LC_ALL=cs_CZ.UTF-8 bash -c 'echo *'
log0Ah log0Bh log0Dh log0Ch
Или, как отметил @ninjalj, даже более странные в венгерских регионах:
$ LC_ALL=hu_HU.UTF-8 bash -c 'echo *'
logX LOGx LOGX logZ LOGz LOGZ logY LOGY LOGy
В zsh
, вы можете выбрать сортировку с квалификаторами glob . Например:
echo *(om) # to sort by modification time
echo *(oL) # to sort by size
echo *(On) # for a *reverse* sort by name
echo *(o+myfunction) # sort using a user-defined function
echo *(N) # to NOT sort
echo *(n) # sort by name, but numerically, and so on.
Числовой вид echo *(n)
также можно включить глобально с помощью numericglobsort
опции:
$ zsh -c 'echo *'
log① log② log00 log01 lóg01 Log01B log02 log0.2 log0A log0B log0C log-0D log4E log4F log50
$ zsh -o numericglobsort -c 'echo *'
log① log② log00 lóg01 Log01B log0.2 log0A log0B log0C log01 log02 log-0D log4E log4F log50
Если вы (как и я) были озадачены этим порядком в данном конкретном случае (здесь используется моя британская локаль), см. Подробности здесь .
sort
такой же, как и для оболочки, когда она расширяет шаблон выделения имени файла.