2

我想设置 inotifywait 以便它监视一个文件夹,并且当将某些内容复制到该文件夹​​(使用 rsync 的 lsyncd)时,我希望 inotifywait 坐下来等到 rsync 完成,然后再调用脚本来处理新文件夹。

我一直在网上研究是否有人这样做,但我没有找到太多。

尽管我了解一些基础知识,但我并不是最精通 bash 脚本。

这是我发现的一个小脚本,它会暂停一秒钟,但每次传输仍会触发十几个事件:

 EVENTS="CLOSE_WRITE,MOVED_TO"

if [ -z "$1" ]; then
    echo "Usage: $0 cmd ..."
    exit -1;
fi

inotifywait -e "$EVENTS" -m -r --format '%:e %f' . | (
    WAITING="";
    while true; do
        LINE="";
        read -t 1 LINE;
        if test -z "$LINE"; then
            if test ! -z "$WAITING"; then
                    echo "CHANGE";
                    WAITING="";
            fi;
        else
            WAITING=1;
        fi;
    done) | (
    while true; do
        read TMP;
        echo $@
        $@
    done
)

我很乐意提供更多细节或信息。

谢谢你。

4

1 回答 1

3

根据您要执行的操作,您可能需要查看Watchman提供的工具。

有两个可能对您最有用:

  1. 如果您想在文件同步后启动一些操作,您可能需要尝试使用watchman-make。如果操作是运行一个工具make,例如工具本身将查看树并产生其输出(换句话说:您不需要将更改文件的精确列表直接传递给您的工具),这是最合适的. 您可以让它运行其他工具而不是 make。您可以使用一个--settle选项让它在最新的文件更改通知之后等待片刻,然后再执行您的工具。

    watchman-make --make='process-folder.sh' -p '**/*.*'

  2. watchman-waitinotifywait. 它还在报告文件已更改之前等待更改解决,但由于此工具不会将多个不同的文件更改合并为单个事件,因此将解决周期配置为被监视树的属性而不是命令行参数

免责声明:我是守望者的创造者

于 2015-11-26T17:16:46.763 回答