n-문자 파일 이름을 ls와 일치시킵니다.

n-문자 파일 이름을 ls와 일치시킵니다.

나는 lsbash에서 이 명령을 사용하고 길이가 n인 모든 파일이나 디렉터리를 찾으려고 노력하고 있습니다. n=5라고 가정

내 명령은 다음과 같습니다

ls ?????

그러나 여기에는 마침표와 같은 알파벳이 아닌 문자도 포함됩니다. 예를 들어 다음 파일이 일치합니다.

ab.cd    
abd.c

5개의 영숫자 이름이 있는 파일만 일치시키고 싶습니다.

five1
five2    
five3

하지만

abc.d    
ab.cd    
a.bcd

명령을 어떻게 수정합니까?

답을 찾으세요:

ls [a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]

답을 찾았는데 어떻게 하면 덜 흉하게 만들 수 있을까요?

답변1

이러한 와일드카드는 해석 되지 않습니다 ls. 이러한 글로브는 쉘에 의해 파일 이름 목록으로 확장되고 인수로 전달됩니다 ls. 표준 glob에 대한 일부 확장(차용 및 활성화) bash이 있지만 다른 쉘과 비교하면 여전히 제한적입니다.ksh88shopt -s extglobzshksh93

그리고 zsh:

setopt extendedglob
ls -d [[:alnum:]](#c5)

ksh93:

ls -d {5}([[:alnum:]])

또는:

ls -d {5}(\w) # (\w includes underscore in addition to alnums)

또는 확장 정규식을 사용하려는 경우:

ls -d ~(E)^[[:alnum:]]{5}$

bash동등한 와일드카드가 없는 다른 POSIX 셸 의 경우 다음을 수행해야 합니다.

ls -d [[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]]

[[:alnum:]]현재 로케일의 모든 알파벳 문자(영문은 물론 라틴 문자뿐만 아니라) 및 0123456789(다른 유형의 숫자도 포함 가능)이 포함됩니다 . 영어 알파벳 문자를 원할 경우 문자 이름을 개별적으로 지정하세요.

c='[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]'
unset -v IFS
ls -d $c$c$c$c$c

또는 C 로케일을 사용하십시오.

(export LC_ALL=C
ls -d [[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]])

답변2

ls -q | grep -Ex '[[:alnum:]]{5}'

답변3

ls언급한 방식으로 사용 하려면 이 -d옵션을 사용해야 합니다. 그렇지 않으면 목록이 표시됩니다.콘텐츠어느목차 그들의 이름은 이름 자체를 나열하는 것이 아니라 5개의 문자 및/또는 숫자로 구성됩니다. 또는 다음을 수행할 수 있습니다.

ls -d [[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]]

하지만 그것은 지금 당신이 얻는 대답과 똑같습니다.

또한, 그렇지 않은 경우필요ls명령에 사용하려면 다음을 사용할 수 있습니다.

echo [[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]]

그러면 모든 일치 항목이 한 줄에 나열됩니다.

printf "%s\n" [[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]][:alnum:]]

그러면 별도의 줄에 나열됩니다.

답변4

변수에서 표현식 작성:

 e=""; for m in $(seq 1 5); do e="$e[A-Za-z0-9]"; done

멋지고 재사용 가능하게 만들려면 함수에 넣으세요.

 alnumglob() {
    local e=""
    for m in $(seq 1 $1) ; do e="$e[A-Za-z0-9]"; done
    echo "$e"
 }

 ls -ld $(alnumglob 5)

관련 정보