bashで増え続けるファイルのリストを繰り返すには?

bashで増え続けるファイルのリストを繰り返すには?

各ファイルの名前が前のファイルの後にアルファベット順に続くファイルジェネレータが実行されています。当初私は同様のループを実行していましたがfor file in /path/to/files*; do...、globはループの前にのみ拡張され、ループ中に生成された新しいファイルは処理されないことをすぐに実現しました。

私の現在のアプローチはとても醜いです。

while :; do
    doneFileCount=$(wc -l < /tmp/results.csv)
    i=0
    for file in *; do
        if [[ $((doneFileCount>i)) = 1 ]]; then
            i=$((i+1))
            continue
        else
            process-file "$file" # prints single line to stdout
            i=$((i+1))
        fi
    done | tee -a /tmp/results.csv
done

上記のハックなしで増え続けるファイルのリストを繰り返す簡単な方法はありますか?

ベストアンサー1

一般的なアプローチは、新しいファイルを1つのディレクトリに表示し、処理後に名前を変更するか、別のディレクトリに移動して同じディレクトリに再会しないようにすることです。だからこんなこと

cd new/
while true; do 
    for f in * ; do
        process file "$f" move to "../processed/$f"
    done
    sleep 1   # just so that it doesn't busyloop
done

または、同様にファイル拡張子を変更します。

while true; do 
    for f in *.new ; do
        process file "$f" move to "${f%.new}.done"
    done
    sleep 1   # just so that it doesn't busyloop
done

Linuxでは、次のものも使用できます。inotifywait新しいファイルに関する通知を受け取ります。

inotifywait -q -m -e moved_to,close_write --format "%f" . | while read -r f ; do
    process file "$f"
done

どちらの場合も、まだ記録されているファイルを監視する必要があります。内部で生成された大容量ファイルは自動的には表示されませんが、スクリプトは書き込みの途中で処理を開始できます。

上記のinotifyイベントはclose_write書き込みプロセスによってファイルが閉じられたときにファイルを見ることができますが(しかし修正されたファイルもキャッチします)、このcreateイベントはファイルが最初に作成されたときにファイルを見るでしょう(しかしそれでも記録されるかもしれません)あります)。moved_to監視しているディレクトリに移動されたファイルをキャプチャするだけです。

おすすめ記事