Mac OSX에서 대소 문자를 구분하지 않는 정렬


30

lsMax OS X Lion에서 파일 및 디렉토리를 Ubuntu Linux와 유사한 방식으로 명령을 만들 려면 어떻게해야합니까 (대소 문자를 구분하지 않고 디렉토리를 맨 위에, 도트 파일을 맨 위에) 이상적으로는 정렬과 같은 다른 명령으로 출력을 파이핑하지 않고이 작업을 수행하고 싶습니다.

예를 들어 다음과 같이보고 싶습니다.

foo
Foobar
MyStuff/
.stuff/
test.txt

대신에:

.stuff
Foobar
MyStuff/
foo
test.txt

Linux에서 ls정렬 순서는 시스템 로케일, 특히로 제어됩니다 LC_COLLATE. 때 LC_COLLATE=en_US.UTF-8ls 원하는 항목을 정렬합니다. 때 LC_COLLATE=C, lsOS X의 유사 정렬합니다

LC_COLLATEen_US.UTF-8OS X에서 로 설정 되었지만 ls여전히 오래된 POSIX방식으로 정렬 됩니다. 아무도 내가 이것을 리눅스처럼 행동하게 만드는 방법을 알고 있습니까?


도움이되는 경우 : apple.stackexchange.com/a/22304/8546 은 HFS Plus가 일반적으로 대소 문자를 구분하지 않지만 대소 문자를 보존 하도록 구성되어 있음을 관찰합니다 .
Graham Perrin

답변:


16

가능하지 않을 수 있습니다 :

ls소스 코드를 살펴보면 strcoll을 사용하여 파일 이름을 정렬하므로 LC_COLLATE를 존중해야합니다.

일부 온라인 게시는 BSD (및 Darwin / OS X)의 로케일이 Linux의 로케일에 비해 다소 손상되었음을 나타냅니다. 나는 자신의 빠른 정렬 프로그램을 작성하여 로케일을 명시 적으로 설정하고 내 컴퓨터 (Mac OS 10.6.3) 및 대학 컴퓨터 (Linux, FC11?)의 en_US.UTF-8 및 C 로켈을 사용하여 테스트했습니다. 정렬은 Linux 시스템 ( "a B c"대 "B a c")에서 예상대로 작동하지만, Mac은 항상 "B a c"로 정렬합니다.

출처 : http://ask.metafilter.com/130292/CaseInsensitive-LS-on-Mac-OS-X

원래 답변

이 명령은 도트 파일을 정렬하지 않지만 추가 디렉토리 목록을 보여줍니다.

ls -f1 

나는 이것에 가까워졌다.

.
..
.stuff
foo
Foobar
MyStuff
test.txt

1
-f 옵션을 사용하여 "정렬 비활성화"에 관심이있는 것은 실제로 예상대로 정렬하는 것 같습니다. 이것이보다 "자연적인"데이터 정렬을 가진 파일 시스템 / HFS + 정렬 항목이라고 가정합니다.
Gerry

6

나는 이것이 답변되었지만 이것이 가장 효과적이라는 것을 알고있다.

ls -f1 -alF -G

모든 세부 사항을 나열하고 대소 문자를 무시하여 정렬합니다.


4

이것은 잠시 동안 나를 괴롭 혔고 마침내 그것을 분류했습니다 (heh). 작동하지 않는 제안을 많이 시도한 후 다음과 같이했습니다.

MacPorts (또는 Homebrew 또는 Fink)를 기꺼이 설치하려면 GNU 버전의 ls가 원하는대로 작동합니다. 필자는 MacPorts를 직접 사용하므로 설명 할 방법입니다.

  1. MacPorts 다운로드 및 설치 :

    http://www.macports.org

  2. GNU Coreutils 패키지를 설치하십시오 :

    sudo port install coreutils

  3. 이제 GNU ls가 있어야합니다 : gls. 대문자와 소문자로 시작하는 항목이 포함 된 디렉토리에서 시도하십시오.

    gls -U

    (이 -U옵션은 실제로 "분류되지 않은"을 의미하지만 OS X에서는 대소 문자를 구분하지 않는 원하는 효과가 있습니다.)

  4. .bash_profile일반에 ls원하는 방식으로 작동 하도록 이 별칭을 추가하십시오 (색상 출력이 마음에 들지만 원하는 경우 생략 할 수 있습니다 -U.

    alias ls='gls -U --color'

-U다른 플랫폼 에서는이 옵션이 작동하지 않을 수 있습니다. OS X에서는 항상 올바른 작업을 수행하는 것 같습니다 (HFS +는 대소 문자를 구분하지 않으므로 기술적으로 "대소 문자 구분").하지만 Linux 상자에서 시도하면 결과가 그렇지 않을 수 있습니다. 전혀 정렬되지 않았습니다.


1
3. 새로운 APFS로 인해 macOS> = 10.13에서 더 이상 원하는 부작용 (-U 옵션)이없는 것 같습니다.
Marius Hofert

1
그렇습니다… APFS로 이것을 할 수있는 방법이없는 것 같습니다.
Jason Sims

그래도 Confirm은 10.12에서 작동합니다. 감사!
대령 패닉

4

Mike가 위에서 쓴 것에 덧붙여 조금 더 나아가서 자신의 데이터 정렬 규칙을 정의하는 방법을 찾았습니다.

로켈 정의는 / usr / share / locale /에 있습니다. 각 폴더는 로케일이며 "동일한"기호를 정의하는 파일 (또는 링크) LC_COLLATE가 있습니다 (예 : 주문시 U, u 및 ü는 동일하게 간주되어야 함). 디렉토리를 복제하면 새 로케일 정의가 작성됩니다.

$ sudo cp -R en_GB.UTF-8/ en_GB.UTF-8-CI/

이제 'en_GB.UTF-8-CI'(대소 문자를 구분하지 않는 경우 'CI')라는 새 로케일이 생성되며 LC_COLLATE를 사용할 수 있습니다.

지금, 당신은에서 로케일 소스를 다운로드 할 수있는 새로운 로케일에서 LC_COLLATE을 변경 http://www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locale.tproj/colldef/ , 편집 한 그것은 당신이 원하는 것과 가장 가깝습니다.

$ colldef < <new collation file>
$ sudo cp LC_COLLATE /usr/share/locale/en_GB.UTF-8-CI/

그리고 지금 네가 달릴 때

$ LC_COLLATE=en_GB.UTF-8-CI ls

규칙 에 따라 정렬해야 합니다 .

예, 이것이 'ls'정렬을 대소 문자를 구분하지 않게하는 데 필요한 것입니다.


2

해결 방법으로 함수와 별명을 사용할 수 있습니다.

function lssorted() { /bin/ls "$@" | sort -f ;}
alias ls='lssorted'

표준 ls 명령에 대해 대소 문자를 구분하지 않고 정렬 된 출력이 생성됩니다.


1
참고해야합니다 : 예를 들어 -l을 사용하면 실패합니다. 그런 다음 ls는 처음에 또 다른 행 "total X"를 생성하며 정렬됩니다.
Arne

2

사용

ls -f

나를 위해 작동합니다.

-f는 공식적으로 모든 정렬을 해제하지만 원래 HFS 정렬이 빛나고있어 대소 문자를 구분하지 않습니다.

실제로 HD 형식은 대소 문자를 구분하는지 여부에 따라 다르지만 대소 문자를 구분하지 않는 HFS 형식은 Mac OS X 시스템 디스크의 기본값이므로 대부분의 사용자에게 적합합니다.


이것이 정답입니다. 그것의 유일한 문제는 -a도 암시 적으로 켜고, 끄는 방법이 없다는 것입니다.을 포함하여 마침표로 시작하는 파일 / 폴더가 표시됩니다. 그리고 ...
lensovet

1
다른 문제 (현재)는 새로운 APFS로 인해 macOS> = 10.13에서 더 이상 작동하지 않는 것입니다.
Marius Hofert

1

Mike의 답변에서 영감을 받아 / etc / bashrc에 다음을 추가했으며 Mojave에서 아름답게 작동합니다. -a가 추가되면 끝에 숨겨진 파일이 나열되지만 귀찮게하지는 않습니다.

export LC_COLLATE="cs_CZ.ISO8859-2"; alias ls='ls -lhFG'

locale 명령을 실행하여 새 구성을 볼 수 있습니다. 되돌리려면 / etc / bashrc에서 라인을 제거하고 터미널에 다시 로그인하십시오.

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="cs_CZ.ISO8859-2"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

ls -f1도 ls -f도 모하비에서 저에게 도움이되지 않았습니다. 나는 진정으로 분류되지 않은 목록으로 끝났습니다. 내가 제공 한 솔루션 만 Mojave에서 저에게 효과적이었습니다.


가장 좋은 대답이지만 주어진 예가 너무 많습니다. 다음 줄을 사용자 .bashrc또는 다음에 입력하십시오 .zshrc.alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
user1561489

0

운영:

$ type ls

당신은 아마도 당신의 ls명령이 별명 임을 알게 될 것입니다 .


리눅스에서 : ls is /bin/ls. OS X의 경우 : ls is hashed (/bin/ls). 어느 쪽이든, /bin/ls직접 호출하더라도 LC_COLLATE에 따라 정렬되지 않습니다.

2
놀랍게도, 당신의 ls명령에 가명을 포함 시켰습니다 --group-directories-first. 별명이 아닌 다른 곳에서 여전히 수행 될 수 있습니다.
MikeyB

0

주로 도트 파일의 정렬 순서에 관심이있는 경우 확장자별로 정렬 할 수 있습니다 ls. GNU Fileutils 의 명령을 옵션과 함께 사용하십시오 --sort=extension. (macports를 통해 GNU Fileutils를 설치할 수 있습니다.)


0

ls는 LC_COLLATE에 따라 정렬됩니다. LC_COLLATE 파일의 대부분은 대소 문자 구분 정렬을 수행하도록 설정되어 있습니다. http://collation-charts.org/fbsd54/

대소 문자를 구분하지 않는 정렬을 위해 두 가지가 있습니다 : cs_CZ.ISO8859-2 및 et_EE.ISO8859-15 et_EE.ISO8859.15는 영어 사용자가 원하는 방식으로 "Z"를 정렬하지 않습니다. cs.CZ.ISO8859-15는 알파벳과 잘 작동합니다. 알파벳 문자 앞에 "~"를 정렬하고 싶습니다.

내 해결책은 다음과 같습니다. LC_COLLATE = cs_CZ.ISO8859-2 / bin / ls -FG

"."를 처리하기 위해 사용자 정의 LC_COLLATE 파일을 만들 수 있는지 궁금합니다. 당신이 원하는 방식과 내가 원하는 방식으로 "~".

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.