We wszystkich powłokach globusy są domyślnie sortowane. Byli już przy pomocy /etc/glob
pomocnika zwanego przez powłokę Kena Thompsona, aby rozwinąć globusy w pierwszej wersji Uniksa na początku lat 70. (i które dały globusom swoją nazwę).
Ponieważ sh
POSIX wymaga sortowania według sposobu strcoll()
, tzn. Przy użyciu kolejności sortowania w ustawieniach regionalnych użytkownika, tak jak ls
choć niektórzy nadal to robią strcmp()
, opartej tylko na wartościach bajtów.
$ 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
Możesz zauważyć powyżej, że w przypadku powłok wykonujących sortowanie na podstawie ustawień regionalnych, tutaj w systemie GNU z en_GB.UTF-8
ustawieniami narodowymi, -
nazwy plików są ignorowane podczas sortowania (większość znaków interpunkcyjnych). Jest ó
on sortowany w bardziej oczekiwany sposób (przynajmniej dla Brytyjczyków), a wielkość liter jest ignorowana (z wyjątkiem przypadków decydujących o powiązaniach).
Jednak zauważysz pewne niespójności dla log for log②. Jest tak, ponieważ kolejność sortowania ① i ② nie jest zdefiniowana w ustawieniach narodowych GNU (obecnie; mam nadzieję, że zostanie to kiedyś naprawione). Sortują to samo, więc otrzymujesz losowe wyniki.
Zmiana ustawień regionalnych wpłynie na kolejność sortowania. Możesz ustawić ustawienia regionalne na C, aby uzyskać strcmp()
sortowanie podobne do:
$ 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
Zauważ, że niektóre ustawienia narodowe mogą powodować pewne nieporozumienia, nawet w przypadku ciągów znaków all-ASCII all-alnum. Jak te czeskich (w systemach GNU przynajmniej) gdzie ch
jest to elementem porównawczym , który sortuje po h
:
$ LC_ALL=cs_CZ.UTF-8 bash -c 'echo *'
log0Ah log0Bh log0Dh log0Ch
Lub, jak wskazał @ninjalj, jeszcze dziwniejsze w węgierskich lokalizacjach:
$ LC_ALL=hu_HU.UTF-8 bash -c 'echo *'
logX LOGx LOGX logZ LOGz LOGZ logY LOGY LOGy
W zsh
możesz wybrać sortowanie za pomocą kwalifikatorów glob . Na przykład:
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.
Numeryczne sortowanie echo *(n)
można również włączyć globalnie za pomocą numericglobsort
opcji:
$ 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
Jeśli jesteś (tak jak ja) zdezorientowany tym zamówieniem w tym konkretnym przypadku (tutaj, używając mojej brytyjskiej lokalizacji), zobacz tutaj, aby uzyskać szczegółowe informacje.
sort
jest taka sama jak w przypadku powłoki, gdy rozwija ona wzorzec globowania nazw plików.