Inotifywaitディレクトリに多数のファイルがあります。

Inotifywaitディレクトリに多数のファイルがあります。

私が望むのは、新しいファイルが作成されるかどうかを監視し(再帰的ではなく1つだけ)、そのファイルが書き込まれるときに大きなファイルに追加することです。

記録されるファイルの数は膨大で、最大50,000個まで可能です。

たとえば、次のようにディレクトリinotifywaitを監視しています。

inotifywait -m -e create ~/folder | awk '($2=="CREATE"){print $3}' > ~/output.file

したがって、生成された新しいファイルの名前を保存して~/output.fileからforループを使用します。

for FILE in `cat ~/output.file` 
do
    cat $FILE >> ~/test.out
done

ファイルの書き込み(生成)速度が1秒~/folderあたり1ファイル程度であれば正常に動作します。

ただし、要件が膨大でファイルが生成される速度も、毎分500ファイル(またはそれ以上)ほど非常に高いです。

プロセスが完了した後にファイル数を確認しましたが、~/folder出力と一致しませんでしたinotifywait。 10~15個程度のファイル差があり、人によって異なります。

しかもループ

for FILE in `cat ~/output.file`
do
done

~/output.fileすべてのファイルが書き込み時に処理されるわけではありません。

誰でも私にこの問題に対する優雅な解決策を提案できますか?

ベストアンサー1

次のコマンドを実行すると、inotifywaitoptionsを使用して出力を後処理する必要はありません。--format--outfile

inotifywait -m --format '%f' -e create /home/don/folder/ --outfile /home/don/output.file

次に、別のタブを開き、cd~/folderを実行します。

time seq -w 00001 50000 | parallel touch {}

real    1m44.841s
user    3m22.042s
sys     1m34.001s

(したがって、毎分500を超えるファイルを受信して​​います。)すべてがうまく機能し、作成したすべてのファイル名がoutput.file含まれています。プロセスがディスクにファイルを書き込むと、その内容をファイルに追加できます(常にオンになっていると仮定)。50000
test.out~/folder

xargs < /home/don/output.file cat >> test.out

または、readファイルの作成時に処理したい場合に使用します。だから、しかし、以下~/folderを実行できます。

inotifywait -m --format '%f' -e create ~/folder | while read file; do cat -- "$file" >> ~/test.out; done

おすすめ記事