ls
다음 파일이 겉보기에 다른 순서로 나열되는 이유는 무엇입니까 ?
기본적으로 ls
파일은 현재 로케일의 사전순으로 나열되지 않습니다. 이것이 기본값인 것 같습니다.
$ ls
a_1 a_10 a_11 a_12
$ ls
a_10-18 a_11-18 a_1-18 a_12-18
나는 alias ls='ls --color=auto'
과 을 가지고 있습니다 LC_COLLATE="en_US.UTF-8"
.
답변1
로케일은 실제로 복잡합니다.목표는 기술적인 지식이 없는 사용자에게 "정상적인 느낌"을 주는 것입니다. (기술자는 LANG=C
이것을 사용하여 따뜻하고 보송보송한 느낌을 얻을 수 있습니다.) 기술적 정의는 다음과 같습니다.유니코드 표준 문서, 여기서 뭔가를 증류하려고합니다. 교정을 받아 기쁘다.
흥미롭게 읽었던 것 같아요로케일데이터 자체가 아닌 데이터를 다루는 사용자의 속성입니다. 예제 문자열에 사용된 문자는 동일하지만 기술 문서에서는 독일 사용자의 정렬 순서가 스웨덴 사용자의 정렬 순서와 다르다는 점을 명확하게 설명합니다.
en_GB 및 en_US 로케일은 이 -
문자를 무시하도록 설정되어 있습니다. 이러한 로케일의 오름차순 정렬 규칙은 매우 간단합니다.
- 대소문자를 구분하지 않음
- 처음에 두 개의 문자열이 동일하지만 하나가 더 길다면 두 번째 문자열이 됩니다. 그래서
xyzA
항상 그 이후야xyz
-
특정 구두점(이 경우 포함)은 다른 구두점과 비교하지 않는 한 무시됩니다.- 숫자는 문자보다 먼저 정렬됩니다.
- 숫자 정렬
0
..9
- 문자 정렬
[Aa]
..[Zz]
(en_GB 및 en_US에는 실제로 악센트가 없습니다) - 특정 문자에 대해 소문자는 대문자 앞에 옵니다(따라서
one
앞에 오지만One
둘 다 앞에 옵니다two
). - 구두점이 정렬되어 있습니다(그러나 이 답변의 예와는 관련이 없음).
관련 데이터세트에 다음 규칙을 적용합니다.
a_1 a_10 a_11 a_12
이는 와 동일하며 a1
a10
a11
a12
규칙 #2를 고려하면 및 에 선행 a1
해야 합니다 . 다른 모든 항목 에는 동일한 수의 영숫자가 있으므로 일관되게 비교할 수 있습니다. 이것은 우리에게 .a10
a11
a1
a_1
a_10
a_11
a_12
a_10-18 a_11-18 a_1-18 a_12-18
#3도 적용된다는 점을 제외하면 동일한 규칙이 적용됩니다(구두점은 무시합니다). 즉 a_1018
a_1118
a_118
a_1218
, 이 값을 로 처리할 수 있으며 규칙 #2와 #4에 따라 순서를 얻습니다 a_10-18
a_11-18
a_1-18
a_12-18
.
댓글의 마지막 예를 들어보세요.
a_10 a_10- a_100 a_101 a_10-18 a_102
규칙 #3을 적용한 다음 규칙 #2, #4를 적용합니다. 따라서 -
주어진 문자를 제거(무시) a_10
a_10
a_100
a_101
a_1018
a_102
하고 나머지를 공통 하위 문자열 접두사로 정렬한 다음 문자 순서로 정렬합니다.
a_10
( 길이 때문에 얻을 수 있을지, 아니면 그냥 그렇게 끝나기 때문에 얻을 수 있을지는 확실하지 않습니다 . 후자를 제안하고 싶지만 누군가 이것을 확인할 수 있기를 바랍니다.)a_10-
답변2
사전순으로 a_1
로 시작하는 다른 문자열 앞에 옵니다 a_1
. 숫자는 합리적인 로케일에서 숫자 순서로 되어 있으므로 합리적인 로케일에서는 a_1
< a_10
< a_11
<입니다 a_12
.
이러한 문자열에 공통 접미사를 추가하면 공통 접미사가 중간에 정렬될 수 있으므로 순서가 변경될 수 있습니다. 두 번째 예에는 공통 접두사로 시작 a_1
하고 접미사 0-18
, 1-18
및 로 끝나는 4개의 문자열이 있습니다 . C 언어 환경에서 문자열은 엄격한 사전순으로 비교되므로 숫자 앞에 나타나므로 < < <가 됩니다. 그러나 대부분의 다른 로케일은 더 복잡합니다. 특히 구두점은 최후의 수단을 제외하고는 무시됩니다. 따라서 < < < 문자열을 비교하려면 먼저 구두점이 없는 문자열을 비교해야 하며, 두 번째 숫자는 < < < 순서이고, 가운데 두 문자열의 세 번째 숫자는 < 순서입니다. 구두점만 다른 문자열을 추가하는 경우 다른 구두점에 따라 정렬 방법이 결정됩니다.-18
2-18
-
-18
a_10-18
a_11-18
a_1-18
a_12-18
a_10-18
a_11-18
a_1-18
a_12-18
a1018
a1118
a118
a1218
0
1
1
2
1
8
a_10-18
a_1-118
a_11-18
a_12-18
내 대답에 대한 설명은 간단합니다. 구두점과 같은 문제를 처리하기 위해 두 개 이상의 패스가 있을 수 있습니다. 이것중환자실 사용자 가이드상당히 자세한 설명이 있습니다(그러나 그것조차도 책 색인과 같은 항목을 정렬하는 모든 미묘함을 다루지는 않습니다).