"ls"가 다음 파일을 겉보기에 다른 순서로 나열하는 이유는 무엇입니까?

"ls"가 다음 파일을 겉보기에 다른 순서로 나열하는 이유는 무엇입니까?

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 로케일은 이 -문자를 무시하도록 설정되어 있습니다. 이러한 로케일의 오름차순 정렬 규칙은 매우 간단합니다.

  1. 대소문자를 구분하지 않음
  2. 처음에 두 개의 문자열이 동일하지만 하나가 더 길다면 두 번째 문자열이 됩니다. 그래서 xyzA항상 그 이후야xyz
  3. -특정 구두점(이 경우 포함)은 다른 구두점과 비교하지 않는 한 무시됩니다.
  4. 숫자는 문자보다 먼저 정렬됩니다.
  5. 숫자 정렬 0..9
  6. 문자 정렬 [Aa].. [Zz](en_GB 및 en_US에는 실제로 악센트가 없습니다)
  7. 특정 문자에 대해 소문자는 대문자 앞에 옵니다(따라서 one앞에 오지만 One둘 다 앞에 옵니다 two).
  8. 구두점이 정렬되어 있습니다(그러나 이 답변의 예와는 관련이 없음).

관련 데이터세트에 다음 규칙을 적용합니다.

a_1  a_10  a_11  a_12

이는 와 동일하며 a1 a10 a11 a12규칙 #2를 고려하면 및 에 선행 a1해야 합니다 . 다른 모든 항목 에는 동일한 수의 영숫자가 있으므로 일관되게 비교할 수 있습니다. 이것은 우리에게 .a10a11a1a_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 언어 환경에서 문자열은 엄격한 사전순으로 비교되므로 숫자 앞에 나타나므로 < < <가 됩니다. 그러나 대부분의 다른 로케일은 더 복잡합니다. 특히 구두점은 최후의 수단을 제외하고는 무시됩니다. 따라서 < < < 문자열을 비교하려면 먼저 구두점이 없는 문자열을 비교해야 하며, 두 번째 숫자는 < < < 순서이고, 가운데 두 문자열의 세 번째 숫자는 < 순서입니다. 구두점만 다른 문자열을 추가하는 경우 다른 구두점에 따라 정렬 방법이 결정됩니다.-182-18--18a_10-18a_11-18a_1-18a_12-18a_10-18a_11-18a_1-18a_12-18a1018a1118 a118 a1218011218a_10-18a_1-118a_11-18a_12-18

내 대답에 대한 설명은 간단합니다. 구두점과 같은 문제를 처리하기 위해 두 개 이상의 패스가 있을 수 있습니다. 이것중환자실 사용자 가이드상당히 자세한 설명이 있습니다(그러나 그것조차도 책 색인과 같은 항목을 정렬하는 모든 미묘함을 다루지는 않습니다).

관련 정보