2017-10-25 18 views
1

私は、ディレクトリ内の各ファイルを調べ、何らかのアクションを実行するbashスクリプトを作成しています。これは何かのように見えるはずです(たぶん?)。継続的に更新されたディレクトリのアップデートを読む

for file in "$dir"* ; do 
    something 
done 

クール、右?問題は、このディレクトリが(新しいファイルで)頻繁に更新されていることです。ある時点で、私はという技術的にをdirのすべてのファイル(つまりfor-loopを終了して)で実行することを保証するものではありませんが、実際には余分なファイルでディレクトリを供給するという保証はありません。 決してのディレクトリに給餌することを保証するものではありません(まあ...塩の穀物でそれを取る)。

同じファイルを複数回処理したくないです。

私は永遠に実行され、すでに処理したすべてのファイルとファイルリストの最初のファイルを追跡する別のファイルリストBを作成しながら、いくつかのファイルリストAを更新し続けるwhileループを作成することを考えていましたファイルリストBにないものが処理されます。

もっと良い方法はありますか?この方法も機能しますか?おかげ

編集:必須では "私はbashの初心者くさいよ"

+1

:?

inotifywaitの出力は次のようになりますか – Barmar

+1

*同じファイルを2回以上処理したくないです。その後、絶えず変化するディレクトリ内の場所に基づいてファイルを処理するためにbashを使用しないでください。 –

+0

@AndrewHenleあなたの提案は何ですか? –

答えて

2

@Barmarは良い提案を持っています。これを処理する1つの方法は、inotifyを使用して新しいファイルを監視することです。 inotify-toolsをシステムにインストールしたら、inotifywaitコマンドを使用して、新しいファイルイベントをループに送ることができます。

あなたのような何かを始める可能性があります。このinotifywaitコマンドは、書き込み用にオープンされた後に閉鎖されているディレクトリおよび(b)のファイルに移動されている(a)のファイルのためのイベントを生成します

inotifywait -m -e MOVED_TO,CLOSED_WRITE myfolder | 
while read dir events file, do 
    echo "Processing file $file" 
    ...do something with $dir/$file... 
    mv $dir/$file /some/place/for/processed/files 
done 

。これは一般的にあなたが望むものを得るでしょうが、あなたの特定のアプリケーションに依存するコーナーケースは常にあります。たぶん、新しいファイルが追加されたときに通知を受けるために `inotify`を使用

tmp/work/ CLOSE_WRITE,CLOSE file1 
tmp/work/ MOVED_TO file2 
+2

これはうまくいきますが、あなたが言いたいコーナーケースは本当に珍しいものではありません。ファイル全体がそこにあるという兆候もありません。このために 'inotify'のようなものを使って私が持っている主な問題は? *イベント駆動*です。イベントは失われる可能性があります。 'inotifywait'が実行されていないときにファイルがアップロードまたは作成された場合、そのファイルは処理されません。私の経験では、純粋に国家ベースのソリューションははるかに信頼性が高いです。 –

関連する問題