내 디렉터리에 다음 파일이 있다고 가정해 보겠습니다.
_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
당신이 원하는 순서를 주어야합니다그리고β
로 표시됩니다 β
.
사용 중인 LANG
UTF-8 로케일로 β
설정 하면 변경할 필요가 없습니다 .β
en_US.UTF-8
LANG
의견 중 하나는 " 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를 사용하고 있습니다.