En todos los depósitos, los globos se ordenan por defecto. Ya fueron ayudados por el /etc/glob
ayudante llamado por el caparazón de Ken Thompson para expandir los globos en la primera versión de Unix a principios de los años 70 (y que dieron su nombre a los globos).
Para sh
, POSIX requiere que se ordenen por strcoll()
, es decir, utilizando el orden de clasificación en la configuración regional del usuario, como ls
aunque algunos todavía lo hacen a través de strcmp()
, que se basa solo en 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
Puede observar más arriba que para aquellos shells que hacen la clasificación basada en la configuración regional, aquí en un sistema GNU con una en_GB.UTF-8
configuración regional, los -
nombres en los archivos se ignoran para la clasificación (la mayoría de los caracteres de puntuación lo harían). El ó
se clasifica de una manera más esperada (al menos para los británicos), y el caso se ignora (excepto cuando se trata de decidir los lazos).
Sin embargo, notará algunas inconsistencias para log① log②. Esto se debe a que el orden de clasificación de ① y ② no está definido en las configuraciones regionales de GNU (actualmente; con suerte, se solucionará algún día). Clasifican lo mismo, por lo que obtienes resultados aleatorios.
Cambiar la configuración regional afectará el orden de clasificación. Puede establecer la configuración regional en C para obtener un strcmp()
tipo similar:
$ 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
Tenga en cuenta que algunas configuraciones regionales pueden causar algunas confusiones incluso para las cadenas all-alnum all-ASCII. Al igual que los checos (al menos en los sistemas GNU), ¿dónde ch
hay un elemento de clasificación que se ordena después de h
:
$ LC_ALL=cs_CZ.UTF-8 bash -c 'echo *'
log0Ah log0Bh log0Dh log0Ch
O, como señaló @ninjalj, incluso los más extraños en los locales húngaros:
$ LC_ALL=hu_HU.UTF-8 bash -c 'echo *'
logX LOGx LOGX logZ LOGz LOGZ logY LOGY LOGy
En zsh
, puede elegir la clasificación con calificadores globales . Por ejemplo:
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.
El tipo numérico echo *(n)
también se puede habilitar globalmente con la numericglobsort
opción:
$ 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
Si usted (como yo estaba) está confundido por ese orden en ese caso particular (aquí usando mi configuración regional británica), vea aquí para más detalles.
sort
es el mismo que para el shell cuando se expande un patrón global de nombre de archivo.