
各ファイルの名前が前のファイルの後にアルファベット順に続くファイルジェネレータが実行されています。当初私は同様のループを実行していましたが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
監視しているディレクトリに移動されたファイルをキャプチャするだけです。