默认情况下,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
在一个终端和命令中运行
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.