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


20

동일한 수준에서 다른 파일 및 디렉토리와 별도로 유지하려는 경우 밑줄 접두어로 파일 및 디렉토리의 이름을 지정할 수 있습니다. 예를 들어 Windows 및 Mac에서 밑줄로 파일을 접두어로 붙이면 영숫자 문자로 시작하는 파일 앞에 맨 앞에 정렬됩니다.

내 인터넷 검색은 LC_COLLATE 및 현재 로케일 (en_US)과 관련이 있음이 밝혀졌습니다. en_US가 예상대로 정렬되지 않는 이유를 이해하지 못하지만 괜찮습니다.

에 기초 ICU 부씩 데모 사이트 en_US_POSIX로 설정 로케일 확실히 내가 찾고 정렬 순서를 가지고 나타납니다 (당신은 편집에 샘플 데이터를 가지고 있고 그것을 테스트하기 위해 일부 밑줄을 추가). 그러나 나는 이것을 Linux 쉘에서 어떻게 적용하는지 알지 못한다.

이상적으로는 항상 bash 구성에서 무언가를 설정하여 ls가 항상 밑줄을 먼저 정렬하도록하고 싶습니다. 어떻게하면 되나요?


"로캘 가져 오기 규칙"을 통해 기본값 또는 en_US_POSIX.txt와 함께 ICU Collate를 사용하여 재생할 수 없습니다. 사용한 설정을 설명 할 수 있습니까?
Mikel


위의 링크를 사용하여 @Mikel을 사용하여 테스트 데이터에 밑줄을 추가 한 다음 제출하여 정렬 결과를 확인하십시오.
Tom Auger

정확히 내가 한 일이며 밑줄로 시작하는 문자열은 밑줄이없는 것처럼 시작이 아닌 중간에서 정렬됩니다.
Mikel

1
데이터 정렬 순서 정의를 실제로 변경하는 관련 질문은 unix.stackexchange.com/questions/421908 입니다.
JdeBP

답변:


5

ls원하는 방식으로 정렬 할 수 없으면 쉘 확장을 시도하십시오.

파일 이름 패턴을 사용하여 사용 ls하는 방법을 무시하고 셸이 이미 정렬 한 파일 목록 으로 실행할 수 있습니다 ls.

ls -lf _* [!_]*

파일이 있다고 가정

_a a _b b _c c

이것은 달리기와 같다

ls -lf _a _b _c a b c

설명:

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

[!_]*알파벳 순서로 확장 된 밑줄로 시작 하지 않는 모든 파일 이름과 일치합니다 .

-f쉘이 이미했기 때문에 정렬 하지 말라고 지시 ls합니다 .

추가 정보 : bash filename expansion

현재 디렉토리에 디렉토리가있는 경우 ls가 디렉토리에 파일을 나열하지 않도록 다음과 같은 명령을 실행하려고합니다.

ls -lfd _* [!_]*

7
그건 그렇고, DOS / Windows / OSX는 실제로 다른 것 앞에 밑줄을 넣지 않습니다 : 문자 앞에 밑줄을 넣는 대소 문자를 구분하지 않지만 밑줄 앞이나 뒤에 다른 문장 부호 문자가 사용됩니다. _파일을 먼저 표시하는 데 사용 하는 것은 OS 별 해킹입니다. 이 핵의 유닉스 버전은 대문자로 파일 이름을 시작하는 것입니다 : 기본 유닉스 규칙은 파일 이름에 소문자 만 사용하는 것입니다.
Gilles 'SO- 악마 그만해'

4
또는 0; 예 00README.
mattdm

1
@Gilles +1은 중요한 파일에서 대문자를 사용하여 가장 먼저 작성하는 유닉스 모범 사례입니다. 하루가 끝날 때, 그것이 관습이라면, 유닉스가 다른 OS와 같은 방식으로 행동하도록 강요하기보다는 단순히 그것을 채택하는 것이 가장 좋습니다. 그래서 Mac이나 Windows 용으로 개발 된 관습을 사용할 수 있습니다. 좋은 팁 주셔서 감사합니다.
Tom Auger

1
@TomAuger -fls자체 정렬을 수행하지 않기 때문에 전달 된 순서대로 인수를 표시합니다. 각 쉘 와일드 카드 확장의 결과 _*와는 [!_]*사전 식 정렬 된 목록입니다.
Gilles 'SO- 악마 그만해'

1
@TomAuger 셸에서 생성 될 때 인수 ls가 정렬됩니다 (두 그룹 :로 시작하는 그룹 _, 다른 그룹). 실행 echo ls -lf _* [!_]*어떻게되는지. -f플래그를 알 수 ls있는 정렬을 할 수 없습니다.
Gilles 'SO- 악마 그만해'

16

소문자와 대문자를 혼합하지 않아도되는 경우 로케일을로 설정 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일부 프로그램이 이외의 소수점 구분 기호를 사용하여 숫자를 생성했기 때문에 무언가 잘못되었다는 것을 제외하고는 대부분 미용 .입니다.


+1 매우 흥미 롭습니다. 따라서이 양식을 사용하면 ls의 한 인스턴스에 대해서만 환경 변수 LC_COLLATE를 임시로 설정합니까? 맞습니까?
Tom Auger

1
대문자 앞에 밑줄을 표시하는 방법은 무엇입니까?
Tom Auger

1
@TomAuger 예, VAR=value cmd세트 VARvalue단지의 환경에서 cmd당신이 그것을 실행 쉘의 값 (또는 값의 부재)을 터치하지 않습니다. 밑줄이 대문자 앞에 나타나게하려면 고유 한 로캘 설정을 정의해야합니다. 적어도 리눅스에서는 표준 라이브러리가 로케일 정의 만 찾을 수 있기 때문에 가능하지만 사용하기는 쉽지 /usr/lib/locale않습니다 . 설정을 ~/.locale넣을 수있는 환경 변수는 없습니다 en_tom.
Gilles 'SO- 악마 그만해'

@TomAuger 이것이 ls명령 에 관한 것이라면 Mikel의 제안 과 함께하십시오 .
Gilles 'SO- 악한 중지'

2

불행히도 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

6
그것이 파일 시스템에 저장되는 방식이기 때문입니다.
Ignacio Vazquez-Abrams 17

3
죄송하지만이 답변은 잘못되었습니다. 테스트 : touch 3 1 _1 _3 2 _2 && ls -fl출력2 . 1 3 _2 _3 .. _1
Marco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.