Podczas sortowania nazw plików ls
ignoruje znaki takie jak -,_
. Spodziewałem się, że użyje również tych znaków do sortowania.
Przykład:
touch a1 a2 a-1 a-2 a_1 a_2 a.1 a.2 a,1 a,2
Teraz wyświetl te pliki za pomocą ls -1
:
a1
a_1
a-1
a,1
a.1
a2
a_2
a-2
a,2
a.2
Spodziewałem się czegoś takiego:
a1
a2
a,1
a,2
a.1
a.2
a_1
a_2
a-1
a-2
tj. spodziewałem się, że znaki niealfanumeryczne będą brane pod uwagę podczas sortowania.
Czy ktoś może wyjaśnić to zachowanie? Czy takie zachowanie jest wymagane przez standard? A może jest to spowodowane kodowaniem UTF-8?
Aktualizacja: Wygląda na to, że jest to związane z sortowaniem UTF-8:
$ LC_COLLATE=C ls -1
a,1
a,2
a-1
a-2
a.1
a.2
a1
a2
a_1
a_2
LC_COLLATE=C ls
?[_-,.]
są grupowane i częściowo ignorowane. Nie wiem dokładnie, jak i gdzie takie sortowanie jest zdefiniowane, ale musi to być problem z sortowaniem, ponieważ po prostu i tylko zmiana sortowania na C (viaLC_COLLATE=C ls -l
) wystarczy, aby dać ci porządek sortowania, którego się spodziewałeś (zakładając, żeLC_ALL
jest to nie zastępujeLC_COLLATE
). Odnosi się to do całego zakresu znaków w wielojęzycznym samolocie podstawowym Unicode ... Zredagowałem swoją odpowiedź, aby dołączyć przykładowy skrypt, który toOdpowiedzi:
To nie ma nic wspólnego z zestawem znaków. Raczej to język określa porządek sortowania. Libc sprawdza język przedstawiony w
$LC_COLLATE
/$LC_ALL
/$LANG
i sprawdza jego zasady sortowania (np./usr/share/i18n/locales/*
Dla GLibC) i porządkuje tekst zgodnie z zaleceniami.źródło
strcoll
na przykład użyć , zobaczyłbyś, że coś takiegoaasa.c
byłoby posortowane powyżejaas.c
.EDYCJA: Dodano test danych posortowanych za pomocą LC_COLLATE = C
Domyślna kolejność zestawiania polega na traktowaniu znaków „interpunkcyjnych” jako
Use LC_COLLATE=C
mających jednakową wartość .. aby traktować je w kolejności współrzędnych kodowych.Wydajność
Poniższy kod testuje wszystkie poprawne znaki UTF-8 w podstawowej płaszczyźnie wielojęzycznej (z wyjątkiem \ x00 i \ x0a ; dla uproszczenia).
Porównuje plik w znanej (generowanej) sekwencji rosnącej z tym plikiem losowo posortowanym, a następnie ponownie posortowanym za pomocą LC_COLLATE = C. Wynik pokazuje, że sekwencja C jest identyczna z oryginalnie wygenerowaną sekwencją.
Wydajność:
źródło
a_1 a2 a_2
byłby niemożliwy.tree
to robi, myślę, że w tej historii jest coś więcej, np. Usuwanie interpunkcji z ciągów porównawczych lub coś w tym rodzaju. Mogę powiedzieć, że/
znak musi być ustawiony jako najniższy znak w sekwencji zestawiania, bez względu na wszystko.