Bash에서 정규식을 사용하여 폴더가 존재하는지 테스트하는 방법은 무엇입니까?

Bash에서 정규식을 사용하여 폴더가 존재하는지 테스트하는 방법은 무엇입니까?

우리 모두 알고 있듯이 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

관련 정보