Bashスクリプト:ls -1を介してファイルを確認していますが、ファイルがない場合はループも実行したいと思います。

Bashスクリプト:ls -1を介してファイルを確認していますが、ファイルがない場合はループも実行したいと思います。

ディレクトリに12個のファイルがあることを確認する必要があります。このループはファイルが1つしかない場合にうまく機能し、「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ではない)を返します。

関連:

関連情報