대소 문자를 구분하지 않고 "ls"가 도트 파일을 먼저 표시하도록 만드는 방법은 무엇입니까?

대소 문자를 구분하지 않고 "ls"가 도트 파일을 먼저 표시하도록 만드는 방법은 무엇입니까?

디렉터리에 다음 파일을 만듭니다.

$ 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도트 파일을 먼저 넣으세요.

$ 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 你好嗎

불행하게도 이로 인해 정렬 순서가 대소문자를 구분하게 됩니다. 즉, Aand 가 and 앞에 B옵니다 . 대소 문자를 구분하지 않고( 및 앞에 오는 ) 도트 파일을 먼저 인쇄하는 방법이 있습니까 ?abAaBb

편집: LC_COLLATE를 수정해 보세요.

지금까지 어떤 답변도 easy 의 기능을 완전히 복제할 수 없습니다 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컴퓨터를 실행하고 다시 시작했습니다. 불행히도 이것은 아무것도 바꾸지 않습니다.

답변1

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.txt및 ), 소문자에 대한 대조가 대문자에 대한 대조 (3488행) 전에 라인 3467에 나타나기 때문에 A.txt세 번째 패스가 먼저 옵니다 .a.txt<MIN><CAP>

이 변경사항을 구현하세요.

생리를 먼저 하고 싶다면매번프로그램은 문자를 정렬하는 데 사용되며 위와 같이 위치 파일을 수정하고 다시 작성할 LC_COLLATE수 있습니다 . iso14651_t1_common하지만 그런 변화를 원하신다면오직루트 액세스 여부에 관계 ls없이 원본 로케일 파일을 수정하기 전에 다른 디렉터리에 복사할 수 있습니다.

내가 뭘 한거지

내 기본 로캘은 en_US이므로 en_US, iso14651_t1및 을 iso14651_t1_common복사합니다 $HOME/path/to/new/locales. 거기서 위와 같이 변경 iso14651_t1_common하고 이름을 .Next 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.

답변2

쉘의 정렬 순서(로케일의 정렬 순서와 관련되지 않을 수 있음; bash, AT&T ksh, yash, ) 를 사용할 수 tcsh있으며 zsh예상한 결과를 제공 mksh하지만 dash그렇지 않습니다. fish대소문자를 구분하지 않는 순서를 제공하는 것처럼 보이지만 ASCII가 아닌 경우 다른 결과(문자)가 나타납니다.

ls -dUl -- .* *

이는 정렬이 비활성화된( GNU 확장자) ls나열할 파일(및 디렉터리)의 명시적인 목록을 제공합니다.ls-U

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

  • 기본 옵션을 사용하면 디렉터리에 숨겨진 파일과 숨겨지지 않은 파일이 없으면 zsh명령이 실패하게 됩니다 . 이를 방지하려면 nomatch비활성화할 수 있지만 대신 이 작업을 수행하는 것이 더 좋습니다(전체적으로 일치하는 항목이 없는 경우에만). 이전 Unix 쉘 에서처럼 명령이 실패합니다 .nomatchset -o cshnullglob(t)csh
  • 이는 의 확장 zshpdksh그 파생물 및 가 fish및 을 포함하지 않기 때문에 일치합니다 . 다른 껍질과 병치되어 일치합니다. 후자의 경우 및 ( )를 제외하도록 와일드카드 패턴을 변경해야 합니다..*...ls -Al...ls -al...ls -dUl -- ..?* .[!.]* *
  • fish와일드카드 패턴이 , (t)csh또는 이외의 zsh항목과 일치하지 않으면 오류 ls메시지가 생성됩니다. nullglob옵션을 설정하거나 ( ) 로 리디렉션하여 이를 방지 할 수 있습니다. 을 사용하는 경우 발생할 수 있는 놀라운 동작에 주의하세요(참조:bashzshstderr/dev/nullls -dUl -- ..?* .[!.]* * 2>/dev/nullnullglob쉘은 '?' 문자를 먹는다). 상호 작용할 때 일치하지 않는 각 glob에 대해 경고 메시지가 방출된다는 점을 제외 하면 와 유사하게 fish동작합니다 .bashnomatch

(고마워하는스티븐 차제라스모든 피드백을 위해! )

답변3

간단히 두 가지 별도의 명령을 사용할 수 있습니다 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

답변4

너는 실행 할수있다엘에스명령 옵션. 이 시도:

# 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

관련 정보