使用 inotify-tools 递归地在多个目录中连续检测新文件

使用 inotify-tools 递归地在多个目录中连续检测新文件

我刚刚安装了 inotify-tools。我想使用notify-tools 递归地连续检测多个目录中的新文件,并使用 postfix 发送电子邮件。我可能可以处理使用 postfix 发送电子邮件的部分。我只是想找出在尝试检测新文件时处理此问题的最佳方法。因为有时会一次添加多个文件。

答案1

通知等待(部分inotify 工具) 是完成您目标的正确工具,即使同时创建多个文件,它也会检测到它们。

这是一个示例脚本:

#!/bin/sh
MONITORDIR="/path/to/the/dir/to/monitor/"
inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
done

通知等待将使用这些选项。

-m无限期地监视目录,如果不使用此选项,一旦检测到新文件,脚本将结束。

-r将递归监视文件(如果有很多目录/文件,则可能需要一段时间才能检测到新创建的文件)

-e 创建是指定要监视的事件的选项,在你的情况下应该是创造关注新文件

--格式'%w%f'将以 /complete/path/file.name 格式打印出文件

“${MONITORDIR}”是我们之前定义的包含要监视的路径的变量。

因此,如果创建了新文件,inotifywait 将检测到它并打印输出(/完整/路径/文件名)到管道并且同时将该输出分配给变量 NEWFILE

在 while 循环中,你会看到一种使用以下方法向你的地址发送邮件的方法:mailx 实用程序这应该可以与您的本地 MTA (在您的情况下是 Postfix) 配合使用。

如果您想监视多个目录,inotifywait 不允许这样做,但您有两个选择,为每个要监视的目录创建一个脚本或在脚本内创建一个函数,如下所示:

#!/bin/sh
MONITORDIR1="/path/to/the/dir/to/monitor1/"
MONITORDIR2="/path/to/the/dir/to/monitor2/"
MONITORDIRX="/path/to/the/dir/to/monitorx/"    

monitor() {
inotifywait -m -r -e create --format "%f" "$1" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &

答案2

使用通知等待, 例如:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

答案3

对于多个目录,您可以这样做:

#!/bin/bash


monitor() {
  inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read NEWFILE
  do
     echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
  done
          }


monitor &

以下是文件中文件夹的示例列表/etc/default/inotifywait /etc/default/inotifywait

/home/user1
/path/to/folder2/
/some/path/

相关内容