
우리 모두 알고 있듯이 bash 명령을 수행하면 폴더가 존재하는지 쉽게 확인할 수 있습니다.
[[ -d /opt/presto-server ]] && echo folder exist
하지만 폴더가 있으면
/opt/presto-server-32.34
그렇다면 정규식을 사용하여 폴더가 존재하는지 어떻게 확인할 수 있습니까?
이 규칙으로
presto-server-<any charecter>
~처럼
presto-server-454.545
presto-server-4a-434
presto-server-aa-434-l
등
답변1
와일드카드 확장으로 인해 얼마나 많은 인수가 발생했는지 계산해 보겠습니다. 먼저, nullglob
일치하는 항목이 없으면 와일드카드 자체 대신 예상되는 0을 얻도록 설정하겠습니다 .
shopt -s nullglob
그런 다음 원하는 스키마에 대한 확장을 요청하고 이를 현재 매개변수로 설정합니다.
set -- /opt/presto-server-*/
뒤에 슬래시가 추가된다는 점에 유의하세요. 이를 위해서는 결과 일치가 디렉토리(또는 디렉토리에 대한 심볼릭 링크)여야 합니다.
그런 다음 몇 개가 있는지 물어보십시오.
[ "$#" -gt 0 ] && echo "There are one or more presto-server- directories"
답변2
다음과 같은 함수를 정의할 수 있습니다 has_dirs
.
has_dirs() {
for f do
[ -d "$f" ] && return
done
false
}
다음과 같이 사용하십시오.
if has_dirs /opt/presto-server-*; then
echo there are matching dirs
fi
이는 디렉토리 또는 디렉토리에 대한 기호 링크에 대해 작동합니다. 디렉토리의 경우에만 다음이 필요합니다.
[ -d "$f" ] && [ ! -L "$f" ] && return
보다 구체적으로 일치시키려면 prestor-server-<number>-<number>
를 사용하여 bash
다음을 수행할 수 있습니다.
shopt -s extglob # to enable a subset of ksh extended globs
has_dirs /opt/presto-server-+([[:digit:]])-+([[:digit:]])
/opt/presto-server-+([[:digit:]])-+([[:digit:]])
잘못된 긍정이 발생할 수 있지만 리터럴 ( failglob
또는 nullglob
이 문제를 해결하는 옵션) 이라는 디렉터리가 있습니다 .
답변3
다음으로 전환할 수 있는 옵션이 제공되는 경우 zsh
:
if ()(($# > 0)) /opt/presto-server-*(N/); then
echo there are directories matching that pattern
fi
어디
() compound-command args
매개변수가 있는 익명 함수입니다.((...))
...
: 산술식을 평가하고 반환하는 복합 명령성공결과가 0이 아닌 경우.$# > 0
$#
: (익명 함수에 대한 인수 수)가 0보다 큰 경우 1로 평가되는 산술 표현식입니다.(N/)
:glob 한정자:N
이 glob에 대해 엽니다. 이 유형의 파일만 선택합니다.nullglob
/
목차(-/
디렉토리에 대한 기호 링크도 포함하도록 변경되었습니다).
이는 나중에 정렬되는 전체 디렉터리 목록을 계산하므로( 일치하는 각 파일에 대해 zsh
작업이 필요함 lstat()
) 매우 효율적이지 않지만 디렉터리 하나만 찾는 것만으로도 충분합니다.
로 구분된 일련의 숫자와 구체적으로 일치하도록 *
이를 변경할 수 있습니다 .<->-<->
-
물론 내부에서는 bash
언제든지 다음을 수행할 수 있습니다.
if zsh -c '()(($# > 0)) /opt/presto-server-<->-<->(N/)'; then
echo there are directories matching that pattern
fi