Bash 스크립트: ls -1을 통해 파일을 확인하고 있는데 파일이 없으면 루프도 수행하고 싶습니다.

Bash 스크립트: ls -1을 통해 파일을 확인하고 있는데 파일이 없으면 루프도 수행하고 싶습니다.

디렉토리에 12개의 파일이 있는지 확인해야 합니다. 이 루프는 파일이 하나만 있을 때 잘 작동하며 "sleep 300"을 사용하여 4번 반복됩니다. 그러나 파일이 전혀 없으면 실패하고 반복되지 않습니다. 파일이 전혀 없더라도 반복되도록 하려면 또 무엇을 추가할 수 있습니까? 간단히 말해서 20분의 파일 전송 시간을 확인하고 싶습니다.

retry() {
attempt_num=0
    while [[ `ls -1 *File*${JulianDate}.* | wc -l` -lt 12 ]]
    do

답변1

ls출력을 구문 분석하지 않습니다.. 파일 목록을 배열로 읽고 배열의 크기를 확인합니다.

retry() {
    while true; do
        files=( *File*${JulianDate}.* )
        (( ${#files[@]} >= 12 )) && break
        sleep for some amount
    done
    do stuff with 12 or more files ...
}

답변2

waitforfiles () {
    n=0
    while [ "$n" -lt 4 ]; do
        set -- *File*$JulianDate.*
        [ "$#" -ge 12 ] && return 0
        sleep 300
        n=$(( n + 1 ))
    done

    return 1
}

if ! waitforfiles; then
    echo 'Not enough files arrived in time.' >&2
    exit 1
fi

# Do something here.

출력을 구문 분석하지 마십시오 ls. 구문 분석은 귀하만 수행할 수 있습니다.바라보다존재하다. 대신 셸을 사용하여 일치시키려는 이름을 일치시킨 다음 일치하는 파일 수를 계산하십시오. 셸은 이 기능을 거의 무료로 제공합니다(외부 유틸리티 lswc.

위의 함수는 300초 동안 대기한 다음 패턴이 12개 이상의 파일 이름과 일치하거나 루프가 4번 실행될 때까지 다시 시도합니다. 파일이 제 시간에 도착했는지 여부에 따라 성공(0) 또는 실패(0이 아님)를 반환합니다.

관련된:

관련 정보