对于每个文件修改,将其复制到另一个文件bash中

时间:2013-11-12 13:01:22

标签: linux bash inotifywait

我想运行服务来监听文件修改和每个添加到文件从文件中删除它并附加到另一个文件 我尝试了这段代码,但它无法像进入无限循环那样工作

   inotifywait -m -e modify "$1" |
    while read folder eventlist eventfile
    do
        cat "$1">>$DESTINATION_FILE
        >$1
    done 

2 个答案:

答案 0 :(得分:2)

每次截断文件时,都会注册为修改,从而触发另一次截断等。尝试测试文件是否包含循环体内的任何内容。

inotifywait -m -e modify "$1" |
while read folder eventlist eventfile
do
    # Only copy-and-clear if the file is not empty
    if [ -s "$1" ]; then
        cat "$1" >> "$DESTINATION_FILE"
        # What if the file is modified here?
        >$1
    fi
done

查看cat与截断之间的评论。你永远不会把这些修改放在$DESTINATION_FILE中,因为你会在循环的下一次迭代之前删除它们。这是不可避免的,除非您的操作系统允许您在$1之前获得cat上的锁定,然后在截断后释放锁定,以便只有一个进程可以写入文件一次。

答案 1 :(得分:2)

正如chepner所指出的,恢复还原也将被视为文件修改。

出路是:

  1. 删除-m参数
  2. 在bash中手动实现while循环
  3. e.g。

    cp "$1" "$1.bak"
    while true; do inotifywait -e modify "$1" | {
        read folder eventlist eventfile;
        cat "$1" >> "$DESTINATION_FILE";
        # OR
        # diff  "$1" "$1.bak"  >> "$DESTINATION_FILE";
        cp "$1.bak" "$1";
        }
    done
    

    注意:我自己没有测试过上面的代码。

    注2:可能存在原子性问题。有时不监视文件修改。因此,当此cat >操作或cp操作正在进行时,有人可能会尝试写入"$1"文件,这将被遗漏。