我试图用inotify-tools制作一个bash脚本,它将通过删除包含“EE”的行来监视目录并修改所有新文件。一旦更改,它将文件移动到另一个目录
#!/bin/sh while inotifywait -e create /home/inventory/initcsv; do sed '/^\"EE/d' Filein > fileout #how to capture File name? mv fileout /home/inventory/csvstorage fi done
请帮忙?
默认情况下,inotifywait -e CREATE的文本输出格式为
原文链接:https://www.f2er.com/bash/387479.htmlwatched_filename CREATE event_filename
其中watched_filename表示/ home / inventory / initcsv,event_filename表示新文件的名称。
所以,代替你的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.