ls가 합리적인 정렬 순서를 수행하도록 하지만 그리스 문자를 "??"로 인쇄하지 않도록 합니다.

ls가 합리적인 정렬 순서를 수행하도록 하지만 그리스 문자를 "??"로 인쇄하지 않도록 합니다.

내 디렉터리에 다음 파일이 있다고 가정해 보겠습니다.

_y a b c x z β

다음 명령은 하나님께서 의도하신 대로 위의 순서대로 나열합니다.

perl -e '@files = <*>; print join(" ",sort @files)'

이것이 내가 ls를 실행할 때 일어나기를 원하는 것입니다. 즉, 그리스어 베타를 포함하여 모든 항목이 올바르게 표시되기를 원하며, 파일 이름의 앞 문자가 항상 뒤 문자보다 오래된 경우와 같이 합리적인 순서로 표시되기를 원합니다. , 다른 경우.

내 우분투 시스템에서 ls의 기본 동작은 다음을 표시하는 것입니다.

a b c x _y z β

인간적인 느낌을 주려는 의도로 밑줄을 문자로 취급하지 않기 때문입니다. 나는 그런 행동을 원하지 않습니다.

이렇게 하면 alias ls='LANG=C ls'정렬이 로케일을 인식하지 않게 됩니다. 그러나 출력은 다음과 같습니다.

_y a b c x z ??

이제 그리스 문자가 올바르게 표시되지 않습니다. 이 환경 변수로 인해 ls가 모든 것을 단일 바이트 ASCII 코드로 해석하게 되고 beta는 아마도 인쇄할 수 없는 일부 문자의 2바이트 조합일 것입니다.

내가 원하는 대로 ls를 수행할 수 있는 방법이 있나요?

답변1

귀하의 로케일이 원하는 순서를 제공하는 en_US.UTF-8경우LC_ALL=C ls

LC_COLLATE=C ls

당신이 원하는 순서를 주어야합니다그리고β로 표시됩니다 β.

사용 중인 LANGUTF-8 로케일로 β설정 하면 변경할 필요가 없습니다 .βen_US.UTF-8LANG

의견 중 하나는 " LANG그리스어로 설정하고 LC_COLLATE"를 제안했습니다 C. 다음과 같은 이유로 귀하의 시도가 LC_COLLATE="C" LANG="el_EL.UTF-8" ls실패했습니다:

  • 그리스어 로케일은 el_GR.UTF-8, 가 아닙니다 el_EL.UTF-8.
  • 제가 틀렸다고 하더라도 el_EL.UTF-8귀하(귀하의 OS)는 아마도 템플릿에서 현지화 파일을 생성하지 않았을 것입니다.

어쩌면 둘 다에 대한 파일을 생성하지 않았을 수도 있습니다 el_GR.UTF-8. 이를 얻으려면 편집 /etc/locale.gen하고 주석 처리를 제거한 el_GR.UTF-8다음 실행해야 합니다 sudo locale-gen. 그러면 LC_COLLATE=C LANG=el_GR.UTF-8 ls작동할 준비가 된 것입니다. 하지만 다시 한번 말씀드리지만, 이렇게 할 필요는 없습니다. 콘텐츠 가 표시 되기 en_US.UTF-8에 충분합니다 . 필요한 것은 정렬 순서를 변경하는 것뿐입니다.ββLC_COLLATE=C

답변2

내 컴퓨터에서:

$ env LC_COLLATE=C ls
_y  a  b  c  x  z  β

귀하의 의견에서 다음과 같이 잘못된 로케일을 지정한 것 같습니다( -N출력을 복사해야 합니다).

$ env LC_COLLATE=C LANG="sdjf" ls
 _y   a   b   c   x   z  ''$'\316\262'
$ env LC_COLLATE=C LANG="sdjf" ls -N
_y  a  b  c  x  z  ??

깨진 로케일만 있는 경우 --show-control-chars -N다음과 같은 플래그를 사용할 수 있습니다.

$ env LC_COLLATE=C LANG="sdjf" ls --show-control-chars -N
_y  a  b  c  x  z  β
$ env LANG=C ls -N --show-control-chars
_y  a  b  c  x  z  β

중요한 경우 Ubuntu 20.04.2를 사용하고 있습니다.

관련 정보