나는 하나의 파일의 존재를 확인하려는 경우, 나는 그것을 사용하기 위해 테스트 할 수 있습니다 test -e filename
또는 [ -e filename ]
.
글로브가 있고 글로브와 이름이 일치하는 파일이 있는지 알고 싶습니다. glob은 0 개의 파일과 일치하거나 (이 경우 아무 것도 할 필요가 없음) 1 개 이상의 파일과 일치 할 수 있습니다 (이 경우 무언가를 수행해야 함). 글로브에 일치하는 것이 있는지 어떻게 테스트 할 수 있습니까? (나는 얼마나 많은 일치 항목이 있는지 상관하지 않으며 하나의 if
명령문으로 루프 없이이 작업을 수행 할 수있는 것이 가장 좋습니다 (간단히 읽을 수 있기 때문에).
( test -e glob*
글로브 파일이 둘 이상 일치하면 실패합니다.)
답변
배쉬 전용 솔루션 :
compgen -G "<glob-pattern>"
패턴을 벗어나면 일치하는 패턴으로 미리 확장됩니다.
종료 상태는 다음과 같습니다.
- 일치하지 않는 경우 1
- ‘하나 이상의 일치 항목’은 0
stdout
glob와 일치하는 파일 목록입니다 .
간결함과 잠재적 부작용 최소화 측면에서 이것이 최선의 선택이라고 생각합니다.
업데이트 : 사용 요청 예.
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