`ls` 명령이 파일을 이렇게 정렬하는 이유는 무엇입니까?

`ls` 명령이 파일을 이렇게 정렬하는 이유는 무엇입니까?

ls 명령을 리버스 엔지니어링하려고 할 때 흥미로운 동작을 발견했습니다. foo.png, foopa.png, 3개의 파일을 만들면 fooqa.pngls는 foopa.png, foo.png, 로 정렬합니다 fooqa.png. .gif 확장자를 사용해도 해봤는데, p와 q가 확장자의 첫 번째 문자와 알파벳의 다음 문자로 대체될 때 발생하는 것 같습니다. 그래서 의 경우에는 .gg와 h라면요. ( fooga.gif, 다음 foo.gif, 다음 fooha.gif)

왜 이런 식으로 출력을 주문합니까?

답변1

로케일의 조합 순서에 따라 다릅니다.

>LANG=en_IE.UTF-8 ls -1 foo*
foopa.png
foo.png
fooqa.png

>LANG=C ls -1 foo* 
foo.png
foopa.png
fooqa.png

LANG 대신 LC_COLLATE 변수를 사용할 수도 있고 C 대신 POSIX 로케일을 사용할 수도 있습니다.

C 데이터 정렬 순서는 순전히 알파벳순입니다(ASCII 순서). 다른 대조 순서(예: 영어)는 공백 및 점과 같은 특수 문자를 구분 기호로 간주하고 "단어"를 별도로 처리하거나 이러한 구분 기호를 무시할 수 있습니다(여기서는 그런 것으로 나타남).

UTF-8이 아닌 로케일도 알파벳 ASCII를 사용하여 정렬됩니다.

>LANG=en_IE ls -1 foo*
foo.png
foopa.png
fooqa.png

좀 더 자세히 살펴보면 구두점을 무시하는 것이 유니코드 인식 로케일의 일반적인 특징인 것으로 보입니다 *.UTF-8.

관련 정보