.RAW 파일 확장자를 테스트하는 방법은 무엇입니까?

.RAW 파일 확장자를 테스트하는 방법은 무엇입니까?

sh30분마다 실행되는 스크립트를 설정하려고 합니다 . 실행할 때마다 디렉터리에 .RAW 파일이 하나 이상 있는지 확인하고 싶습니다. 파일 확장자를 찾으면 다른 코드를 실행하게 되지만 지금은 사용할 올바른 if 문을 찾을 수 없습니다.

이 코드 예제가 가장 이상적인 접근 방식이 아니라는 것을 알고 있지만, 제가 시도한 코드는 다음과 같습니다. 이는 분명히 잘못된 것입니다.

cd ./dir/
if [ ! -f "*.RAW"]; then
  echo "No files!"
else
  echo "Yes files!"
fi

.RAW 확장자가 있는지 올바르게 테스트하는 방법은 무엇입니까?

답변1

그리고 zsh:

files=(*.RAW(DN))
if (($#files)); then
  echo Yes
else
  echo No
fi

당신이 옳다면정기적인암시했듯이 파일(또는 일반 파일에 대한 심볼릭 링크) -f은 다음과 같습니다.

file=(*.RAW(ND-.))

대신에.

POSIX적으로:

has_regfiles_by_extension() {
  for ext do
    for file in .*."$ext" ."$ext" *."$ext"; do
      [ -f "$file" ] && return
    done
    return 1
  done
}

if has_regfiles_by_extension RAW raw; then
  echo YES
else
  echo NO
fi

를 사용하려면 ls다음과 같이 하세요.

if ls -Aq | grep -q '\.RAW$'; then
  echo yes
else
  echo no
fi

한 가지 이점은 디렉터리를 읽을 수 없는 경우(셸 glob의 경우처럼 자동으로 무시되는 대신) 오류 메시지가 표시된다는 것입니다.

답변2

귀하의 예시 답변이 거의 정확합니다. 먼저 ".RAW"테스트 문자열을 끝 문자열에서 분리 해야 합니다 ].

if [ ! -f "*.RAW" ];

이 경우 따옴표 바깥에 별표를 넣어 쉘 글로빙을 수행할 수 있습니다. 따라서 완성된 명령은 다음과 같습니다.

if [ ! -f *".RAW" ];

그러나 다음 작업을 수행하려는 경우에는 이 접근 방식이 덜 유용합니다.사용문서 .RAW. 이 경우 디렉터리에 있는 각 파일의 확장자를 다음과 같이 비교합니다.

for file in "test/"*; do
    if [ "${file##*.}" = "RAW" ]; then
        echo "Found raw file"
    fi
done

Bash 구문 ${var##*.}은 수행할 수 있는 영리한 쉘 인수 확장의 일부입니다. 자세한 내용은 다음에서 확인할 수 있습니다.GNU 웹사이트.

답변3

모든 도움에 감사드립니다. 비록 일부는 작동하지 못하지만요.

그러나 다른 질문에 대한 답변에서 찾은 코드를 성공적으로 구현했습니다! (https://unix.stackexchange.com/a/87476)

export DIR=./folder
if ls ${DIR}/*.RAW &>/dev/null
then
  echo "Yes!"
else
  echo "No!"
fi

답변4

두 가지 Bourne Shell 솔루션

Bourne 쉘을 사용하십시오(배열이나 쉘 옵션은 지원되지 않습니다.빈 공또는글로벌 실패) glob을 찾을 수 없으면 0이 아닌 종료 상태 또는 glob 자체가 반환된다는 사실을 처리해야 합니다. 예를 들어:

if [ -n "`ls *.RAW 2> /dev/null`" ]; then
    echo "At least one RAW file found!"
else
    echo "No RAW files found."
fi

일반적으로 말하면 의존해서는 안됩니다.엘에스명령이지만 이는 사용 사례에 충분하며 Bourne 셸의 제한 사항을 해결합니다. 실제로 쉘 내장 기능만 사용하려면 할당을 사용하고 glob 자체를 오류 조건으로 명시적으로 테스트해야 합니다. 예를 들어:

files=*.RAW
if [ "$files" = "*.RAW" ]; then
    echo "No RAW files found."
else
    echo "At least one RAW file found!"
fi

관련 정보