我刚刚安装了 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/