어떻게 만들 수있다 "LS"쇼 dotfiles 첫 번째 경우를 구분 머무시는 동안?


21

디렉토리에 다음 파일을 생성합니다.

$ touch .a .b a b A B 你好嗎

내 기본 ls순서는 다른 파일을 섞여서, 주요 점의 존재를 무시합니다.

$ ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:06 你好嗎

내가 할 수 변경 LC_COLLATE 먼저 dotfiles를 넣어.

$ LC_COLLATE=C ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun  8 17:06 你好嗎

불행하게도이 정렬 순서 대소 문자를 구분, 즉하게 A하고 B선행 a하고 b. 대소 문자를 구분 (머무시는 동안 처음 dotfiles를 인쇄 할 수있는 방법이 있나요 Aa선행 Bb)?

편집 : LC_COLLATE 수정 중

지금까지 답변 중 어느 것도 ls쉽게 기능을 완전히 복제하지 못했습니다. 생각 나게, 나는 그것들 중 일부를 함수로 감쌀 수는 있지만, 여기에는 인수없이 디렉토리를 제공하는 것과 인수없이 작동하는 방법에 대한 자세한 코드가 포함되어야합니다. 또는 명시 적 -d플래그 를 처리하는 방법 .

또는 LC_COLLATE사용 하는 것이 더 나을 수도 있다고 생각했습니다 . 그러나 나는 그 일을 할 수없는 것 같습니다. 현재을 사용하고 LC_COLLATE="en_AU.UTF-8"있습니다. 나는 확인했다. /usr/share/i18n/locales/en_AU(이 파일이 올바른 파일인지 확실하지 않지만,에 대한 참조를 볼 수 없으므로 UTF-8); 나는 다음을 발견했다.

LC_COLLATE
copy "iso14651_t1"
END LC_COLLATE

/usr/share/i18n/locales/iso14651_t1포함 copy "iso14651_t1_common"합니다. 마지막으로, /usr/share/i18n/locales/iso14651_t1_common포함

 <U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .

이 줄을 삭제하고을 실행 한 다음 sudo locale-gen컴퓨터를 다시 시작했습니다. 불행히도 이것은 아무것도 바뀌지 않았습니다.

답변:


11

OP는 편집에 매우 가까웠 /usr/share/i18n/locales/iso14651_t1_common지만 트릭은 줄 을 삭제 하지 않는 것입니다.

<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .

그러나 오히려 그것을 수정하기 위해

<U002E> <RES-1>;IGNORE;IGNORE;<U002E> # 47 .

왜 이것이 작동 하는가

IGNORE문은 마침표 (일명 기간, 또는 문자를 지정 <U002E>알파벳 단어를 주문하는 경우) 무시됩니다. 도트 파일을 먼저 만들려면 IGNORE다른 모든 문자 앞에 오는 조합 기호로 변경하십시오 . 조합 기호는 다음과 같은 선으로 정의됩니다.

collating-symbol <something-inside-angle-brackets>

그들은 라인의 모양에 의해 주문됩니다

<something-inside-angle-brackets>

의 제 사본 iso14651_t1_common에서 첫 번째 장소 조합 기호는 <RES-1>3458 행에 나타납니다. 파일이 다른 경우 먼저 배치 된 조합 기호를 사용하십시오.

LC_COLLATE를 사용한 문자 순서에 대한 세부 사항

<U002E>IGNORE관계의 경우 문자를 여러 번 비교할 수 있기 때문에 세 가지 진술이 있습니다. 이를 이해하려면 소문자 a와 대문자 A(실제로 4 번 비교되는 문자 그룹의 일부)를 고려하십시오.

<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A

여러 번의 비교를 수행하면 "a"와 "A"로 시작하는 파일을 그룹화 할 수 있습니다. 두 파일은 <a>첫 번째 단계에서와 같이 비교되므로 다음 문자가 순서를 결정합니다. 다음 문자가 모두 같은 경우 (예 : a.txtA.txt), a.txt소문자 <MIN>에 대한 데이터 정렬 기호가 대문자 <CAP>(3488)에 대해 3467 행에 나타나기 때문에 세 번째 패스가 먼저 입력 됩니다 .

이 변경 구현

프로그램이을 (를) 사용하여 문자를 주문할 때마다 기간이 먼저 오기를 원하는 경우 위에서 설명한대로 LC_COLLATE수정 iso14651_t1_common하고 위치 파일을 다시 작성할 수 있습니다. 이 변경을 만들고 싶어하지만 ls루트 액세스하지 않고, 당신이 그들을 수정하기 전에 다른 디렉토리에 원래 로케일 파일을 복사 할 수 있습니다.

제가 한

내 기본 로케일은 내가 복사, 그래서 en_US입니다 en_US, iso14651_t1그리고 iso14651_t1_common$HOME/path/to/new/locales. 위에서 위에서 언급 한 변경을 iso14651_t1_common하고로 이름 en_US을 변경 했습니다 en_DOTFILE. 다음으로 en_DOTFILE 로캘을 컴파일했습니다.

localedef -i en_DOTFILE -f UTF-8 -vc $HOME/path/to/new/locales/en_DOTFILE.UTF-8

기본 ls순서 를 바꾸려면 다음과 같은 BASH 스크립트를 만드십시오 ls.

#!/bin/bash
LOCPATH=$HOME/path/to/new/locales LANG=en_DOTFILE.UTF-8 ls "$@"

/usr/bin경로 앞에 나타나는 어딘가에 저장하고로 실행 가능하게 만드십시오 chmod +x ls.


물론, 당신은 당신의 닷 파일을보기 위해 -a 또는 -A를 추가해야하지만, 당신이 그것들을 항상보고 싶지 않다면, BASH 스크립트가 아니라 명령 행에서 그렇게하는 것이 합리적입니다
beandip

훌륭한! 고마워, 이건 완벽 해! 방금 루트 소유의 파일을 수정 했으므로 스크립트를 테스트하지 않았습니다. 그러나 귀하는에 큰 따옴표를 넣어야한다고 생각합니다 $@.
Sparhawk

좋은 전화-큰 따옴표 추가
beandip

11

; 당신은 로케일의 조합 순서 포함하지 수있는 (대신 쉘의 정렬 순서를 사용할 수 있습니다 bash, AT & T ksh, yash, tcshzsh예상 결과를, mksh그리고 dash하지 않습니다. fish소문자를 구분하지 순서를 제공하는 것 같다하지만 비 ASCII가 다른 결과를 제공합니다 문자) :

ls -dUl -- .* *

이것은 ls명시 적으로 나열 할 파일 (및 디렉토리)의 목록을 제공하고 ls의 정렬 ( -UGNU 확장)을 비활성화 합니다.

사용중인 쉘에 따라 몇 가지주의 사항이 있습니다.

  • 을 사용 하면 디렉토리에 숨겨진 파일과 숨겨지지 않은 파일이 모두 없으면 zsh기본 nomatch옵션으로 인해 명령이 실패합니다. nomatch이를 피하기 위해 비활성화 할 수는 있지만 set -o cshnullglob대신 수행 하는 것이 좋습니다 (t)csh.
  • zsh, pdksh그 유도체 fish, .*의 확장이 포함되지 않습니다 ...이 일치하므로, ls -Al. 다른 쉘 .과 함께 ..포함되어 있으므로 일치 ls -al합니다. 후자의 경우 글 로빙 패턴을 변경하여 제외 .하고 ..( ls -dUl -- ..?* .[!.]* *) 를 변경해야합니다 .
  • 를 제외하고 fish, (t)csh또는 zsh글 로빙 패턴의 아무것도 일치하지 않는 경우, ls오류 메시지를 생성합니다; nullglob옵션 을 설정 bash하거나 zsh(적어도) 또는 ( ) 로 리디렉션 stderr하여 이를 피할 수 있습니다 . 를 사용한다면 , 잠재적으로 놀라운 행동을 일으키는 것을 조심하십시오 ( '?`문자를 먹는 쉘 참조 ). 대화식 일 때 일치하지 않는 각 glob에 대해 경고 메시지가 발행된다는 점 을 제외하고는 작동 합니다./dev/nullls -dUl -- ..?* .[!.]* * 2>/dev/nullnullglobfishbashnomatch

( 모든 의견을 준 Stéphane Chazelas 에게 감사드립니다 !)


모든 쉘이 로케일의 조합 순서를 사용하여 목록을 정렬하지는 않습니다. mksh그리고 dash예를 들어 대문자와 소문자를 구별하지 않고로 분류되지 않습니다.
Stéphane Chazelas

1
하는 것으로 -U(분류되지 않은 의미)는 GNU 확장이다. lsFreeBSD와 같은 다른 구현에는 -U정렬되지 않은 목록이 아닙니다.
Stéphane Chazelas

GNU ls에서는 POSIXLY_CORRECT가 환경에 있지 않는 한 구현이 인수 뒤에 옵션을 허용 하므로 --이전에 필요합니다..*
Stéphane Chazelas

몰래 (+1)! 그러나 모든 경우, 즉 별칭이나 함수에서 어떻게 쉽게 사용할 수 있는지 잘 모르겠습니다. 예를 들어 특정 디렉토리를 ls인수로 지정하려면 변경해야합니다 .
Sparhawk

1
@PeterCordes [!.]가 정확합니다. pubs.opengroup.org/onlinepubs/9699919799/utilities/…를 참조하십시오 . 일부 (대부분의) 셸 은 부정 된 문자 클래스 글로브에서 ^동의어로 사용할 수 !있습니다. 어쨌든, 나는 .[!.] .??* *약간 더 이해하기 쉬운 것을 선호합니다.[!.]* ..?* *
jrw32982는 Monica

4

두 가지 별도의 ls명령을 사용할 수 있습니다 .

$ ls -dl ..?* .[^.]* 2>/dev/null ; ls -dl *
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 .a
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 .b
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 a
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 A
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 b
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 B
-rw-r--r--. 1 sparhawk sparhawk 0  8 Jun  09:29 你好嗎

지금까지의 다른 답변과 달리이 방법은 먼저 ...항목을 사용 하지 않고 도트 파일을 표시 한 다음 나머지 항목을 ls 사전 순으로 표시합니다.

@StephenKitt 답변은 동일한 결과를 달성하기 위해 향상 될 수 있습니다.

$ ls -dUl ..?* .[^.]* * 2>/dev/null

+1도 있지만 StephenKitt의 답변에 따르면 별칭, 함수 등 모든 경우에 어떻게 쉽게 사용할 수 있는지 잘 모르겠습니다. 예를 들어 특정 디렉토리를 ls인수로 지정하려면 변경해야합니다 . (FWIW 저는 zsh를 사용하고 있지만 이것은 bash 사람들에게 유용합니다.)
Sparhawk

-2

ls 명령 옵션으로 재생할 수 있습니다 . 이 시도:

# ls -laXr

어디에:

-l     use a long listing format
-a, --all
              do not ignore entries starting with .
-X     sort alphabetically by entry extension
-r, --reverse
              reverse order while sorting

미안하지만, 내가 원하는 것을하지 않는 것 같습니다. -X플래그는 이후의 확장에 의해 정렬 .완전히 다르다. 또한 파일은 알파벳 역순입니다. 또한, 도트 파일이 첫 번째 예이지만 모든 경우에 작동하지는 않습니다 (예 :) a.b c.d .a .c. 또한 -a대신에 사용 했습니다 -A.
Sparhawk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.