sh
30분마다 실행되는 스크립트를 설정하려고 합니다 . 실행할 때마다 디렉터리에 .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