inotify和bash

时间:2011-09-24 22:50:03

标签: bash inotify

我正在尝试使用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

请帮帮忙?

3 个答案:

答案 0 :(得分:21)

默认情况下,inotifywait -e CREATE的文本输出格式为

     watched_filename CREATE event_filename

其中watched_filename代表/home/inventory/initcsvevent_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.

答案 1 :(得分:10)

inotifywait的输出格式为:

filename eventlist [eventfilename]

如果您的文件名可以包含空格和逗号,则解析起来很棘手。如果它只包含'理智'文件名,那么你可以这样做:

srcdir=/home/inventory/initcsv
tgtdir=/home/inventory/csvstorage
inotifywait -m -e create "$directory" |
while read filename eventlist eventfile
do
    sed '/^"EE/d'/' "$srcdir/$eventfile" > "$tgtdir/$eventfile" &&
    rm -f "$srcdir/$eventfile
done

答案 2 :(得分:1)

引用inotifywait的手册页:

inotifywait will output diagnostic information on standard error and event information  on
   standard  output.  The event output can be configured, but by default it consists of lines
   of the following form:

   watched_filename EVENT_NAMES event_filename

   watched_filename
          is the name of the file on which the event occurred.  If the file is a directory, a
          trailing slash is output.

换句话说,它将文件的名称打印到标准输出。因此,您需要从标准输出中读取它们并对它们进行操作以执行您想要执行的操作。