ls가 밑줄 문자를 먼저 정렬하도록 하려면 어떻게 해야 합니까?

ls가 밑줄 문자를 먼저 정렬하도록 하려면 어떻게 해야 합니까?

동일한 수준의 다른 파일 및 디렉터리와 구분하려는 경우 밑줄 접두사를 사용하여 파일 및 디렉터리의 이름을 지정할 수 있는 기능이 마음에 듭니다. 예를 들어 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

설명하다:

_*밑줄로 시작하는 모든 파일 이름과 일치하고 알파벳순으로 확장되는 쉘 패턴입니다.

[!_]*모든 파일 이름과 일치아니요밑줄로 시작하고 알파벳순으로 확장합니다.

-fls말하다아니요쉘이 이미 이 작업을 수행하고 있으므로 정렬되었습니다.

추가 정보: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

관련 정보