如何在目录内容变化时自动调用bash脚本

pal*_*ali 5 linux bash shell ubuntu

我的目标是在任何新文件添加到特定目录或该特定目录的任何子目录时自动运行bash脚本.

细节场景:

我正在创建一个从教师向学生提交文件的自动化流程,反之亦然.发件人将上传文件,它将以格式ex中存储在LAMP服务器的Uploads目录中."name_course-name_filename.pdf".我想要一些方法,以便当任何文件存储在Uploads文件夹中时,同时调用脚本并将该文件发送到receive列表.从数据库中我可以找到该特定课程和学生的接收者列表.

我唯一关心的问题是,如果目录内容发生变化,如何自动调用脚本并使其在单个文件上工作.Cron将间隔但不是实时工作.

hek*_*mgl 5

Linux为此目的提供了一种很好的机制inotify.inotify主要作为C API提供.但是也开发了shell实用程序.您应该使用inotifywaitinotifytools(在Debian PKG名)这一点.这是一个基本的例子:

#!/bin/bash

directory="/tmp"   # or whatever you are interested in

inotifywait -m -e create "$directory" |
while read folder eventlist eventfile
do
    echo "the following events happened in folder $folder:"
    echo "$eventlist $eventfile"
done
Run Code Online (Sandbox Code Playgroud)

更新:

如果问题变得复杂,例如你必须监视递归的,动态的目录结构,你应该看看incron它是一个像守护进程一样的cron,它在某些事件上执行脚本.但事件是文件系统事件而不是计时器事件.

  • 使用带有`inotifywait`的`-r`标志来查看所有子目录.请阅读`inotifywait`的手册页. (2认同)

小智 1

“inotifywait”还有另一个选项:

-d --daemon 与 --monitor 相同,但在后台运行,将事件记录到必须由 --outfile 指定的文件中。意味着--syslog。

为了完整性:

-m --monitor 无限期执行,而不是在收到单个事件后退出。默认行为是在第一个事件发生后退出。

在“while”语句的 do-done 块中,您可以解析每个事件报告以获取有趣的详细信息,然后使用“case-esac”根据您关心的每个事件采取操作。

对于您计划依赖的操作,您还可以考虑用某种配置文件替换硬编码的“$directory”。此类文件可能包括路径和文件名、该路径和文件的有趣事件以及这些事件发生时要运行的脚本。该脚本可能会将事件列表作为参数,然后再次“case-esac”。

只是一个人的漫步,~~~ 8d;-丹