inotify和bash

use*_*091 24 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
Run Code Online (Sandbox Code Playgroud)

请帮忙?

Jam*_*at7 22

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

     watched_filename CREATE event_filename
Run Code Online (Sandbox Code Playgroud)

where watched_filename表示/home/inventory/initcsvevent_filename表示新文件的名称.

所以,代替你的while inotifywait -e ...线,放:

    DIR=/home/inventory/initcsv
    while RES=$(inotifywait -e create $DIR); do
        F=${RES#?*CREATE }
Run Code Online (Sandbox Code Playgroud)

并在您的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
Run Code Online (Sandbox Code Playgroud)

在一个终端和命令中运行

touch a aa; sleep 1; touch aaa;sleep 1; touch aaaa
Run Code Online (Sandbox Code Playgroud)

在另一个终端运行,第一个终端出现以下输出:

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.
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 11

输出inotifywait的形式如下:

filename eventlist [eventfilename]
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)