[bash] 글로브가 bash에서 일치하는지 테스트하십시오.

나는 하나의 파일의 존재를 확인하려는 경우, 나는 그것을 사용하기 위해 테스트 할 수 있습니다 test -e filename또는 [ -e filename ].

글로브가 있고 글로브와 이름이 일치하는 파일이 있는지 알고 싶습니다. glob은 0 개의 파일과 일치하거나 (이 경우 아무 것도 할 필요가 없음) 1 개 이상의 파일과 일치 할 수 있습니다 (이 경우 무언가를 수행해야 함). 글로브에 일치하는 것이 있는지 어떻게 테스트 할 수 있습니까? (나는 얼마나 많은 일치 항목이 있는지 상관하지 않으며 하나의 if명령문으로 루프 없이이 작업을 수행 할 수있는 것이 가장 좋습니다 (간단히 읽을 수 있기 때문에).

( test -e glob*글로브 파일이 둘 이상 일치하면 실패합니다.)



답변

배쉬 전용 솔루션 :

compgen -G "<glob-pattern>"

패턴을 벗어나면 일치하는 패턴으로 미리 확장됩니다.

종료 상태는 다음과 같습니다.

  • 일치하지 않는 경우 1
  • ‘하나 이상의 일치 항목’은 0

stdoutglob와 일치하는 파일 목록입니다 .
간결함과 잠재적 부작용 최소화 측면에서 이것이 최선의 선택이라고 생각합니다.

업데이트 : 사용 요청 예.

if compgen -G "/tmp/someFiles*" > /dev/null; then
    echo "Some files exist."
fi


답변

nullglob 쉘 옵션은 실제로 bashism입니다.

nullglob 상태를 지루하게 저장하고 복원 할 필요가 없도록, glob를 확장하는 서브 쉘 내에서만 설정합니다.

if test -n "$(shopt -s nullglob; echo glob*)"
then
    echo found
else
    echo not found
fi

더 나은 휴대 성과보다 유연한 글 로빙을 위해서는 find를 사용하십시오 :

if test -n "$(find . -maxdepth 1 -name 'glob*' -print -quit)"
then
    echo found
else
    echo not found
fi

명시 적 -print -quit 조치는 기본 내재 된 -print 조치 대신 찾기에 사용 되므로 찾기 기준과 일치하는 첫 번째 파일을 찾은 즉시 찾기 가 종료됩니다. 많은 파일이 일치하는 경우 또는 이보다 훨씬 빠르게 실행되어야 하며 확장 된 명령 행을 과도하게 채울 가능성을 피할 수 있습니다 (일부 쉘은 길이가 4K로 제한됨).echo glob*ls glob*

경우 찾기가 과도 같은 느낌 가능성에 맞게 파일의 수가 작고, 사용 합계 :

if stat -t glob* >/dev/null 2>&1
then
    echo found
else
    echo not found
fi


답변

#!/usr/bin/env bash

# If it is set, then an unmatched glob is swept away entirely -- 
# replaced with a set of zero words -- 
# instead of remaining in place as a single word.
shopt -s nullglob

M=(*px)

if [ "${#M[*]}" -ge 1 ]; then
    echo "${#M[*]} matches."
else
    echo "No such files."
fi


답변

나는 좋아한다

exists() {
    [ -e "$1" ]
}

if exists glob*; then
    echo found
else
    echo not found
fi

파일이 많지 않은 한 읽기 쉽고 효율적입니다.
주요 단점은 외형보다 훨씬 미묘하다는 것입니다. 때로는 긴 의견을 추가해야한다는 느낌이 듭니다.
일치하는 항목이 있으면 "glob*"셸에서 확장되고 모든 일치 항목이에 전달되어 exists()첫 번째 항목을 확인하고 나머지 항목은 무시합니다.
일치하는 "glob*"것이 없으면 전달 exists()되어 존재하지 않는 것으로 발견됩니다.

편집 : 오 탐지가있을 수 있습니다, 의견을 참조하십시오


답변

globfail을 설정했다면이 미친 것을 사용할 수 있습니다 (실제로는 안됩니다)

shopt -s failglob # exit if * does not match 
( : * ) && echo 0 || echo 1

또는

q=( * ) && echo 0 || echo 1


답변

test -e에는 깨진 심볼릭 링크가 존재하지 않는다고 생각하는 불행한 경고가 있습니다. 그래서 당신도 그것들을 확인하고 싶을 수도 있습니다.

function globexists {
  test -e "$1" -o -L "$1"
}

if globexists glob*; then
    echo found
else
    echo not found
fi


답변

그의 아이디어에 따라 MYYN의 대답을 다소 단순화하려면 다음을 수행하십시오.

M=(*py)
if [ -e ${M[0]} ]; then
  echo Found
else
  echo Not Found
fi