如何在Linux中更改目录的内容时自动运行脚本?

每当将新文件复制到特定目录时,我都想自动运行脚本。 换句话说,Linux有没有办法“观察”一个目录的变化,然后运行一些东西来响应变化?

如果你足够幸运,可以使用apt-get install dnotify 。 其他发行版可能有类似的东西 – 寻找dnotify名字。

dnotify是一个基于Linux内核2.4.19 +的dnotify API的简单程序。 每次特定目录的内容改变时,dnotify都可以执行指定的命令。 它从命令行运行,并有两个参数:要监视的一个或多个目录以及每当目录发生更改时执行的命令。 选项控制要触发的事件:在目录中读取文件时,创build,删除等。

如果你想在你自己的程序中处理这个,dnotify也是你想使用的API。

你可以用inotify-tools运行一个脚本,就像这样。 它会监视修改文件,新文件和已删除文件的更改目录,然后执行该脚本。

 #!/bin/sh while inotifywait -e modify -e create -e delete /home/me/code; do rsync [options] /home/me/code/ /media/nfs/code/ done 

incron基本上是你想要的,我想。 它使用inotify作为通知机制(像其他人指出的那样,取代了dnotify),但是不需要使用inotifywait或类似的(尽pipe显然,incron守护进程一直在运行)连续运行的脚本。 系统范围的“crontabs”和用户“crontabs”与标准cron类似,但不是指定时间作为触发器,而是使用inotify事件和文件/目录名称。

我相信incron是为许多发行版而打包的,包括Ubuntu和Debian。

有一个专门用于此目的的软件, autoenv您可能想要检查它。

熵是我见过的最简单,最可组合的文件通知工具。 它的用途是优化观看文件,而不是目录,但它也可以解决你的情况。

要检测添加的文件并对其执行操作,请将其与其他工具(如make结合使用。 不会发送名称或类似的东西,它只是运行你告诉它运行的东西。

检查目录中添加的文件:

 ## entr exits with rc=0 when terminated ## rc=1 when watched files go away or don't exist to begin with ## rc=2 when new files arrive in watched directories until echo /path/to/directory_to_watch | entr -d do_stuff do sleep 1; done 

如果您还想在现有文件更改时采取行动:

 ## Here's why it comes in handy that entr exits when new files are added -- ## find gets re-run. until find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/* | entr -d do_stuff do sleep 1; done 

…这就是循环机制派上用场的地方,因为如果添加文件, findexpression式将再次运行。

如果你想要更好的error handling,并希望确保每个添加/删除的文件只运行一次,事情会变得有点古怪,但对于这些简单的情况,这是辉煌的。


编辑:如果你想在系统级别上做这个,像incron ,只需将脚本添加到您最喜欢的进程pipe理器(如s6 , runit , systemd或sysvinit,并跳过循环:

 #!/bin/bash exec entr -d do_stuff < <(find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/*) 

exec和进程replace( <(...) )在从进程pipe理器运行时非常重要,以正确处理信号(即将shell排除在外)。