デフォルトでは、からのテキスト出力inotifywait -e CREATE
は
watched_filename CREATE event_filename
どこで をwatched_filename
表し、新しいファイルの名前を表します/home/inventory/initcsv
。event_filename
したがって、while inotifywait -e ...
行の代わりに次のように入力します。
DIR=/home/inventory/initcsv
while RES=$(inotifywait -e create $DIR); do
F=${RES#?*CREATE }
あなたのsed
行$F
では名前として使用しますFilein
。$(...)
構成はプロセス置換の posix 互換形式 (多くの場合、バックティックを使用して行われます) であり、${RES#pattern}
結果は$RES
最短のパターン一致プレフィックスを削除したものと同じであることに注意してください。パターンの最後の文字は空白であることに注意してください。 [アップデート 2 を参照]
更新 1空白を含む可能性のあるファイル名を処理するには、sed 行"$F"
で$F
. つまり、 の値への参照を二重引用符で囲みますF
。
RES=...
とのF=...
定義では二重引用符を使用する必要はありませんが、必要に応じて使用してもかまいません。たとえば 、空白を含むファイル名を処理する場合F=${RES#?*CREATE }
、F="${RES#?*CREATE }"
両方とも問題なく機能します。
更新 2 Daan のコメントに記載されinotifywait
ているように、出力の形式を制御する--format
パラメーターがあります。コマンド付き
while RES=$(inotifywait -e create $DIR --format %f .)
do echo RES is $RES at `date`; done
1 つの端末とコマンドで実行
touch a aa; sleep 1; touch aaa;sleep 1; touch aaaa
別の端末で実行すると、次の出力が最初の端末に表示されました。
Setting up watches.
Watches established.
RES is a at Tue Dec 31 11:37:20 MST 2013
Setting up watches.
Watches established.
RES is aaa at Tue Dec 31 11:37:21 MST 2013
Setting up watches.
Watches established.
RES is aaaa at Tue Dec 31 11:37:22 MST 2013
Setting up watches.
Watches established.