ディレクトリに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
。解析はあなただけが行うことができます。バラより存在する。代わりに、シェルを使用して一致させる名前を一致させ、一致するファイルの数を数えます。シェルはこの機能をほぼ無料で提供します(外部ユーティリティls
とwc
。
上記の関数は300秒間待機し、パターンが12を超えるファイル名と一致するか、ループが4回実行されるまで再試行します。ファイルが時間に到着したかどうかに応じて、成功(0)または失敗(0ではない)を返します。
関連: