Em todos os shells, os globs são classificados por padrão. Eles já foram/etc/glob
chamados pelo assistente de Ken Thompson para expandir os globs na primeira versão do Unix no início dos anos 70 (e que deram o nome aos globs).
Pois sh
, o POSIX exige que eles sejam classificados por meio de strcoll()
, isto é, usando a ordem de classificação no código do idioma do usuário, como, ls
embora alguns ainda o façam, com strcmp()
base apenas em valores de bytes.
$ 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
Você pode observar acima que, para os shells que fazem a classificação com base na localidade, aqui em um sistema GNU com uma en_GB.UTF-8
localidade, os -
nomes dos arquivos são ignorados na classificação (a maioria dos caracteres de pontuação o faria). A ó
classificação é ordenada de maneira mais esperada (pelo menos para o povo britânico), e o caso é ignorado (exceto quando se trata de decidir laços).
No entanto, você notará algumas inconsistências no log① log②. Isso ocorre porque a ordem de classificação de ① e ② não está definida nos locais GNU (atualmente; esperamos que seja corrigido algum dia). Eles têm a mesma classificação, para que você obtenha resultados aleatórios.
Alterar a localidade afetará a ordem de classificação. Você pode definir o código do idioma para C para obter uma strcmp()
classificação semelhante a:
$ 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
Observe que alguns códigos de idioma podem causar algumas confusões, mesmo para cadeias all-alnum all-ASCII. Como os tchecos (pelo menos nos sistemas GNU), ch
é um elemento de classificação que se classifica depois h
:
$ LC_ALL=cs_CZ.UTF-8 bash -c 'echo *'
log0Ah log0Bh log0Dh log0Ch
Ou, como apontado por @ninjalj, ainda mais estranhos nos locais húngaros:
$ LC_ALL=hu_HU.UTF-8 bash -c 'echo *'
logX LOGx LOGX logZ LOGz LOGZ logY LOGY LOGy
Em zsh
, você pode escolher a classificação com qualificadores glob . Por exemplo:
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.
A ordenação numérica echo *(n)
também pode ser ativada globalmente com a numericglobsort
opção:
$ 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
Se você (como eu estava) está confuso com essa ordem nessa instância específica (aqui usando meu local britânico), consulte aqui para obter detalhes.
sort
é a mesma da shell quando está expandindo um padrão de globbing de nome de arquivo.