동일한 수준의 다른 파일 및 디렉터리와 구분하려는 경우 밑줄 접두사를 사용하여 파일 및 디렉터리의 이름을 지정할 수 있는 기능이 마음에 듭니다. 예를 들어 Windows 및 Mac에서 파일 앞에 밑줄을 붙이면 파일이 영숫자 문자로 시작하는 파일보다 맨 위에 정렬됩니다.
내 인터넷 검색 결과 LC_COLLATE 및 현재 로케일(en_US)과 관련이 있는 것으로 나타났습니다. 괜찮습니다. 비록 en_US가 예상대로 정렬되지 않은 이유를 정말로 이해하지 못하더라도 말이죠.
기반으로ICU 콜레이트 시연 현장로케일을 en_US_POSIX로 설정하면 확실히 내가 찾고 있는 정렬 순서가 있는 것 같습니다. 테스트하려면 샘플 데이터를 편집하고 밑줄을 추가해야 합니다. 하지만 Linux 셸에 적용하는 방법을 잘 모르겠습니다.
이상적으로는 ls가 항상 밑줄을 먼저 정렬하도록 bash 구성에서 무언가를 설정할 수 있기를 바랍니다. 어떻게 해야 하나요?
답변1
소문자와 대문자를 혼합하지 않으려면 로케일을 로 설정하세요. 그러면 C
숫자 순서대로 문자가 허용됩니다. _
대문자와 소문자 사이.
$ LC_COLLATE=C ls
BAR FOO _score _under hello world
$ LC_COLLATE=en_US ls
BAR FOO hello _score _under world
지역 설정 LC_MESSAGES
(오류 메시지 언어), LC_CTYPE
(문자 집합) 및 LC_TIME
(날짜 및 시간 형식)이 유용합니다. LC_COLLATE
그리고 LC_NUMERIC
종종 가치보다 더 많은 문제가 발생하므로 설정을 권장하지 않습니다. 적절한 사전 순서 지정은 LC_COLLATE
예상보다 더 복잡하며 정규식에서 문자 범위를 사용할 때 모든 종류의 이상한 동작을 유발할 수 있습니다. LC_NUMERIC
어떤 프로그램은 .
.
답변2
ls
원하는 대로 정렬 할 수 없다면 쉘 확장을 시도해 보세요.
ls
정렬된 파일 목록에서 쉘을 실행하기 위해 파일 이름 패턴을 사용 ls
하는 방법을 우회할 수 있습니다.
ls -lf _* [!_]*
파일이 있다고 가정하면
_a a _b b _c c
마치 달리는 것 같아
ls -lf _a _b _c a b c
설명하다:
_*
밑줄로 시작하는 모든 파일 이름과 일치하고 알파벳순으로 확장되는 쉘 패턴입니다.
[!_]*
모든 파일 이름과 일치아니요밑줄로 시작하고 알파벳순으로 확장합니다.
-f
ls
말하다아니요쉘이 이미 이 작업을 수행하고 있으므로 정렬되었습니다.
추가 정보:bash 파일 이름 확장자
현재 디렉터리에 디렉터리가 있는 경우 ls가 디렉터리의 파일을 나열하지 않도록 다음과 같은 명령을 실행해야 합니다.
ls -lfd _* [!_]*
답변3
안타깝게도 Linux는 로케일 정보를 얻기 위해 ICU가 아닌 glibc를 사용하기 때문에 ICU를 glibc에 적용하거나 glibc의 로케일 정보를 보완하는 등의 상당한 노력 없이는 Linux에 직접 적용할 수 없습니다.
답변4
정렬 없이 스위치를 추가하면 -f
다음과 같이 보입니다.
man ls
[root@dusknoir ~/java/test]# ls -fl
total 0
-rw-r--r-- 1 root wheel 0 Jun 1 13:27 _1
-rw-r--r-- 1 root wheel 0 Jun 1 13:27 _2
-rw-r--r-- 1 root wheel 0 Jun 1 13:27 _3
-rw-r--r-- 1 root wheel 0 Jun 1 13:27 1
-rw-r--r-- 1 root wheel 0 Jun 1 13:27 2
-rw-r--r-- 1 root wheel 0 Jun 1 13:27 3