모든 쉘에서 글롭은 기본적으로 정렬됩니다. 그들은 이미/etc/glob
70 년대 초 유닉스의 첫 번째 버전에서 글로브를 확장하기 위해 Ken Thompson의 쉘에 의해 호출 된 도우미에 의해있었습니다 (그리고 글로브에 이름을 지어주었습니다).
의 경우 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
모든 로케일은 모든 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
는 파일 이름 글 로빙 패턴을 확장 할 때의 셸과 동일합니다.