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


17

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

Answers:


39

inotifywaitinotify-tools的一部分)是完成目标的正确工具,不管同时创建多个文件,它都会检测到它们。

这里是一个示例脚本:

#!/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" "yourmail@addresshere.tld"
done

inotifywait将使用这些选项。

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

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

-e create是用于指定要监视的事件的选项,在这种情况下,应创建它以处理新文件

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

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

因此,在创建新文件的情况下,inotifywait将对其进行检测,并将输出(/complete/path/file.name)打印到管道,同时将输出分配给变量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" "yourmail@addresshere.tld"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &

我忘记为示例脚本中使用的命令添加一些解释,这就是编辑答案的原因...我还添加了脚本,以防op想要监视多个目录。关于inotifywait工具,因为op正在使用inotify-tools,所以不提它就不可能回答问题。顺便说一句,我是这里的新手,所以我需要学习很多有关网络礼节的知识,所以,抱歉,如果我的答案与你的重叠,那不是我想要的,我只是想给op一个完整的答案。再次抱歉。
sahsanu

没问题,欢迎来到SU。学习网络礼节通常很难,因为在任何地方都没有真正定义。
harrymc

4
@sahsanu我不同意整个“网络礼节”。每个人都从自己的角度回答问题。答案之间没有重叠,也没有重写的答案。当问题如此具体时,答案就不可能以这种方式有所不同。非常感谢您抽出宝贵时间详细回答问题。对于像我这样刚刚了解所有这一切的人,这提供了比您所知道的更多的帮助。您为我节省了无数小时。
大卫·卡斯特

1
@harrymc Netiquetta 在这里定义。
大卫·卡斯特

在不断变化的环境中,网络礼节无法绝对定义,除非在书面上写得不好,否则本网站上的习惯是不重复答案,甚至鼓励通过编辑来纠正答案。在民主社区中,不同意始终是您的权利。@sahsanu可以避免我的发言,在显示他的脚本时参考我以前的回答,无论如何都要得到您的认可。那就是我要代替他做的事情,这就是我的网络礼仪,我相信我会与他人(当然,不是与所有人)分享。
harrymc

8

使用inotifywait,例如:

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

有关更多信息和示例,请参阅文章
如何使用inotify-tools触发文件系统事件上的脚本


1
如果有人使用它并以大写形式转换读取的变量,则您将无法在while内运行某些命令。这是因为您将覆盖$ PATH变量。
Savageman

2
正是由于这个原因,强烈建议不要使用@Savageman为自己的变量使用大写变量名。大写变量名保留供系统使用;您自己的变量应使用小写。
人间

@tripleee感谢您提供的信息,不再使用大写的vars了:)
Savageman

0

对于几个目录,您可以执行以下操作:

#!/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" "yourmail@addresshere.tld"
  done
          }


monitor &

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

/home/user1
/path/to/folder2/
/some/path/
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.