默认情况下,从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正如大安的评论中指出的,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.
为什么不使用'--format%w'选项输出,所以只能使用文件名? – Daan
@达安,是的,这是有道理的(%f,而不是%w)。查看更新2 –
'inotifywait -e delete_self aSymlinkFilename'不会工作,如果符号链接被删除,只有当它的真实文件被删除:(,它也不会工作在破损的符号链接:( –