私が望むのは、新しいファイルが作成されるかどうかを監視し(再帰的ではなく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
次のコマンドを実行すると、inotifywait
optionsを使用して出力を後処理する必要はありません。--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