1

「stopfile」がディレクトリに書き込まれるまで、「receive_dir」ディレクトリをポーリングし続けるスクリプトが必要です。

これは、空のディレクトリにもかかわらず実行する必要があります。

これまでのところ、私はこれを持っていますが、「単項演算子が必要」のファイルがなく、 receive_dir が空の場合は失敗します。ヘルプ !!

#!/usr/bin/ksh

until [ $i = stopfile ]
 do
   for i in `ls receive_dir`; do
   time=$(date +%m-%d-%Y-%H:%M:%S)
   echo $time
   echo $i;
  done
done
4

4 に答える 4

1

あなたは何も評価しておらず、「テスト」はそれを評価できません。

~> [ $empty_var = stopfile ]
-bash: [: =: unary operator expected

まず、ls を解析しないでください:

http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29

編集:問題の一部は、ループが実際にテストを行っていることです。次のようなことを試してください( receive_dir が相対的であると仮定します):

@ user000001 は正しいです。私の元の検索例でも同じ問題が発生するため、次のようになります。

for i in receive_dir/*
do
    time=$(date +%m-%d-%Y-%H:%M:%S)
    echo $time
    echo $i
    [ $i = stopfile ] && break
done

編集:あなたのコメントに基づいて別の例を追加します:

これはどう...

FOUND="N"
while [ "${FOUND}" = "N" ]
do
    for i in receive_dir/*
    do
        time=$(date +%m-%d-%Y-%H:%M:%S)
        echo $time
        echo $i
        [ "$i" = stopfile ] && FOUND="Y"
    done
sleep 60 
done
于 2013-07-17T18:39:51.207 に答える
0

もう 1 つのオプションはinotifywait、ディレクトリのステータスを監視するために使用することです。たとえば、このスクリプトは、ファイル「stopfile」に触れるまでループを実行します。

until inotifywait "receive_dir" | grep "stopfile"
do 
    echo "running" 
done
echo "done"

利点は、これらがビジー ループではないことと、(潜在的に高価な) find コマンドを繰り返し呼び出す必要がないことです。

于 2013-07-17T19:05:25.543 に答える