나는 ls
bash에서 이 명령을 사용하고 길이가 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
이 있지만 다른 쉘과 비교하면 여전히 제한적입니다.ksh88
shopt -s extglob
zsh
ksh93
그리고 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)