Nautilus(GNOME 파일)가 완전히 알파벳순으로 정렬되지 않은 것으로 나타났습니다.
$ touch 1
$ touch 2
$ touch 3
$ touch '!2'
그러면 파일이 다음 순서로 표시됩니다 !2 1 2 3
. !
ASCII 코드가 숫자보다 작으므로 완전히 알파벳순입니다 . 파일을 더 추가해 보겠습니다.
$ touch a
$ touch b
$ touch c
$ touch '!b'
이제 파일이 다음 순서로 표시됩니다 !2 1 2 3 a !b b c
. 이 표시는 앞뒤에 !b
표시됩니다 . 이는 파일이 더 이상 알파벳순으로 완전히 정렬되지 않음을 의미합니다.b
a
$ touch 01
$ touch 02
$ touch 001
$ touch 002
!2 1 01 001 2 02 002 3 a !b b c
. 처음에는 숫자가 알파벳 순서로 되어 있는 것처럼 보였지만 0으로 시작하는 파일을 추가한 후에는 이러한 이론이 깨졌기 때문에 이는 훨씬 더 혼란스럽습니다.
흥미롭게 ls
도 그는 노틸러스의 의견에 동의하지 않았습니다.
$ which ls
/usr/bin/ls
$ ls
001 002 01 02 1 '!2' 2 3 a ab ac '!b' b ba c
노틸러스는 여기서 어떤 알고리즘을 사용하고 있습니까 ls
? Debian stable Gnome 문서 버전 43.2.
답변1
기본적으로 'ls'는 'sort'에서 사용하는 것과 동일한 libc 로캘별 정렬 순서를 사용합니다. 모든 *.UTF-8
로케일(와는 별개로 C.UTF-8
), Glibc는 구현합니다.유니코드 정렬 알고리즘(또는 다른 것그것에 가까운)는 현재 로케일에 맞춰집니다.
(예를 들어 'LC_COLLATE' 섹션을 참조하세요.로케일데이터/로케일/es_ES.)
ls
출력을 LC_COLLATE=C.UTF-8 ls
(또는 )과 LC_COLLATE=C ls
비교하십시오 .
Nautilus에서 사용하는 알고리즘은 다음을 중심으로 회전합니다.g_utf8_collate_key_for_filename()GLib2에서 제공됩니다. 이것은 또한 로케일 기반이지만 소스 코드에는 "자연스러운" 숫자 순서도 제공됩니다.설명하다작동 방식.
(노틸러스에도 있습니다.추가 코드도트 파일과 백업 파일(예: .*
sums #*
)은 항상 도트가 아닌 파일 다음에 정렬되며 데이터 정렬 키보다 우선순위가 높습니다. )
GNU 'ls'에는 -v
Nautilus와 비슷하게 숫자를 처리하는 "자연(버전)" 정렬 옵션이 있습니다(그러나 항상 로케일 순서보다는 ASCII 순서를 사용합니다). 마찬가지로 "sort"에도 가 있습니다 -V
.
이것은 완전히 알파벳순입니다! ASCII 코드로 표현된 숫자보다 작음
이것은 따르지 않습니다. ASCII 코드로 정렬아니요"알파벳순으로 정렬". 기껏해야자연유형. (IBM이 자사 PC에서 EBCDIC를 사용하지 않는다는 점을 다행이라고 생각하세요...)
우선, ASCII 순서가 Z
앞에 옵니다 a
. 이는 영어에서도 분명히 알파벳이 아닙니다. (두 경우 모두 로케일 인식 순서가 사용되는 AaBbCc..
반면, ASCII 순서는 C 또는 C.UTF-8을 로케일로 지정하여 강제로 적용됩니다 ABC..Zabc..
.)
또한 내 이름에는 ASCII가 아닌 알파벳 문자가 포함되어 있습니다. "ASCII 순서로 알파벳순으로 정렬"은 정의되지 않은 작업이며 유니코드 코드 포인트 순서로 정렬해도 결과는 다음과 같습니다. 언어를 구사합니다. (올바른 순서는 U+0065 < U+0117 < U+0066입니다.) "ASCII"의 "A"는 "문자"가 아니라 "America"를 의미한다는 점을 기억하세요.
반면에 ASCII 순서에는 실제로 알파벳에 속하지 않는 문자가 포함되므로 알파벳 순서에 가중치가 없습니다.
이 표시는 앞뒤에
!b
표시됩니다 . 이는 파일이 더 이상 알파벳순으로 완전히 정렬되지 않음을 의미합니다.b
a
완전히 알파벳순으로 정렬되므로 및 둘 모두 !
알파벳이 아닌 문자 와 동일한 가중치를 갖습니다 .b
!b