bash에서 명령을 사용하여 ls
길이가 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
해당 글로브를 해석하는 것은 아닙니다 . 이러한 glob은 셸에 의해 인수로 전달되는 파일 이름 목록으로 확장됩니다 ls
. 쉘마다 글로빙 기능이 다릅니다. bash
표준 glob에 대한 몇 가지 확장 기능이 있지만(에서 빌리고 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
동등한 globbing 연산자가 없는 다른 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
옵션을 사용해야 합니다. 그렇지 않으면 다음을 나열합니다.내용물어떤 것의디렉토리
이름 자체를 나열하는 것이 아니라 이름이 다섯 글자 및/또는 숫자로 구성된 것입니다. 또한, 당신은 할 수 있습니다
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)