파일이 여러 개 있는지 확인하고 없으면 새로 만드시겠습니까?

파일이 여러 개 있는지 확인하고 없으면 새로 만드시겠습니까?

따라서 여러 다른 소프트웨어에서 수행되는 계산을 자동화하는 스크립트를 작성해야 합니다. 전체 스크립트가 작동하고 첨부된 스크립트에서 최상위 스크립트가 전체 스크립트에서 작동합니다.

문제는 첫 번째 계산에서 계산이 작동하면 "Test.FChk" 및 "run.log"라는 파일이 인쇄된다는 것입니다. 계산이 실패하면 "Test.FChk"가 아닌 "run.log"만 인쇄됩니다. 그래서 무슨 일이 일어나고 있는지 현재 스크립트가 "Test.FChk"를 테스트하지만 계산이 실패하면 무한 루프에 빠지게 되므로 스크립트에서 run.log 파일이 있는지 테스트하고 Test.FChk가 있는지는 테스트하지 않기를 원합니다. 그리고 스크립트는 종료되지만 둘 다 찾으면 스크립트의 다음 부분으로 진행하고 계산이 진행되는 동안 파일이 생성되기를 기다리면서 "작업 상태 확인 중"을 인쇄합니다.

###script that works###
while [ ! -f "Test.FChk" ]
do
    echo "Checking job status of Gaussian: $JOBNAME..."
    sleep 5
done

###script that doesnt work###
while true; do
    if [[ ! -f "Test.FChk" && -f "run.log" ]]; then
        echo "Checking job status..."
        sleep 5
        printf "Calculation failed, script ended"
        return
    fi
    break
done

답변1

네 가지 가능성이 있습니다. 파일 a는 존재하지만 파일 b는 존재하지 않습니다. 반대로 두 파일이 모두 존재하거나 파일이 모두 존재하지 않습니다. 첫 번째 가능성만 제어할 수 있고 나머지 세 개는 제어할 수 없습니다. 하지만 당신이 말했듯이, 당신이 뭔가를 하고 싶다면두 파일이 모두 존재함, 그래서 통제해야 합니다.

 while true; do
    if [[ ! -f "Test.FChk" && -f "run.log" ]]; then
        echo "Checking job status..."
        sleep 5
        printf "Calculation failed, script ended"
        return
    # here you control if both files exist
    elif [[ -f "Test.FChk" && -f "run.log" ]]; then 
        break # break the loop, the next code will continue
    fi 
    ### this will just stop the loop at the first iteration!
    break ### not something you need
    ###
done

답변2

솔루션은 하나 이상이 존재할 때까지 계속 실행되며, run.log누락된 경우 스크립트를 종료합니다. Test.FChk두 파일이 모두 존재하면 스크립트가 계속됩니다.

#!/bin/bash

while true; do
    if [ -f "run.log" ]; then
        if [ -f "Test.FChk" ]; then
            # calculation finished, break loop
            break
        fi
        echo "Calculation failed, exiting." >&2
        exit 1
    fi
    echo "Checking job status..."
    sleep 5
done

echo "Calculation successfully finished!"
# do something

관련 정보