一个脚本中的多个 inotify 事件

Posted

技术标签:

【中文标题】一个脚本中的多个 inotify 事件【英文标题】:Multiple inotify events in one script 【发布时间】:2020-10-28 17:09:39 【问题描述】:

我正在尝试编写一个 bash 脚本(作为服务安装)来监视多个目录并将在该目录中创建的任何文件移动到另一个目录。例如,我想将 /home/test/directory1 中创建的任何文件移动到 /opt/directory1,但我也想将 /home/test/directory2 中创建的任何文件移动到 /opt/directory2,但都在一个脚本中作为运行服务。到目前为止,这是我的脚本;

#/bin/bash

directory=/home/test/directory1
archive=/home/test/archive
target=/opt/directory1

inotifywait -m "$directory" --format '%w%f' -e create |
    while read file; do
        cp "$file" "$archive"
        mv "$file" "$target"
    done

任何指针将不胜感激, 谢谢。

【问题讨论】:

这里没有问题。什么按预期工作?什么没有按预期工作?执行脚本时会发生什么?有任何错误信息吗?请在您的问题中添加更多信息。 因此,当脚本执行时,它会按预期工作,但我想将相同的代码结构添加到同一个脚本中,但要查看不同的目录并将文件也移动到不同的目录 【参考方案1】:

当然,这可以通过一些额外的逻辑来完成;警告:这假定任何目标目录都存在于/home/test/opt 下,并且它们的名称匹配。

#!/bin/bash
# we use an array to store the watched directories
directories=(/home/test/directory5 /home/test/directory6)
archive="/home/test/archive"
target="/opt"
inotifywait -m --format '%w%f' -r -e create "$directories[@]/#/" | 
    while read spotted; 
        do
            cp "$spotted" "$archive"
            mv "$spotted" "$( echo $spotted|awk 'BEGINFS=OFS="/"print "/opt",$(NF-1),$NF ')"
        done

另一个观察:如果在您的任一目录中创建同名文件,存档中的目标将被覆盖。您可能需要考虑一下。

【讨论】:

我明天试试这个,我会告诉你我的进展如何。谢谢 所以它确实按预期工作了?感谢您回来;) 我以此为基准来编辑我需要的内容。谢谢!

以上是关于一个脚本中的多个 inotify 事件的主要内容,如果未能解决你的问题,请参考以下文章

异步读取 inotify 描述符失败

实时备份工具之inotify+rsync

为啥inotify会丢失事件?

Perl Linux::Inotify2 - 不能再响应事件了

CentOS7 inotify-tools+lftp 实现文件实时同步

通过inotify实现反调试