默认情况下,文本输出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=...
andF=...
定义不需要使用双引号,但是如果你喜欢使用它们是可以的;例如: 在处理包含空格的文件名时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
在一个终端和命令中运行
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.