Linux如何监控文件变动,并运行Python脚本?

需要监控某个文件夹是否有变动,并输出变动的子文件夹目录给Python脚本作为参数使用。
请问有什么解决办法吗?

我查到有inotifywait可以监控文件变动和执行命令,但貌似不能输出目录作为参数。

GitHub - gorakhargosh/watchdog: Python library and shell utilities to monitor filesystem events.

看起来有些复杂,我学习一下去(希望能看懂 :rofl:

放弃啦,看不懂 :thinking:

要是监控所有文件的最后修改时间,每五分钟扫一次,每次取出最后修改时间在五分钟内的文件,可能会简单一点

您可以试一下这个脚本。它能每隔一段时间列出被监视目录中有改动的文件或文件夹的名称。代码如下:

#!/bin/sh

while(true)
do
    ls 被监视目录 -l --time=ctime --time-style='+%Y-%m-%d-%H-%M-%S' > old.txt
    sleep 1
    ls 被监视目录 -l --time=ctime --time-style='+%Y-%m-%d-%H-%M-%S' > new.txt
    paste -d " " old.txt new.txt > compare.txt
    awk '$6 != $13 {print $7}' compare.txt
done

代码解释:

  1. 脚本先列出被监视目录下的所有文件及其修改时间,并保存到 old.txt 中(第5行);
  2. 而后等待 5 秒(第6行,等待秒数可根据需要修改)
  3. 再次列出被监视目录下的所有文件及其修改时间,并保存到 new.txt 中(第7行);
  4. 接下来将两张信息表拼接为一张表格(第8行);
  5. 并列出文件修改时间发生变化的文件或文件夹的名称(第9行)。

经上述操作,我们就可以每5秒列出一次5秒内发生改动的文件/文件夹。

注意事项:

  1. 请不要将这个脚本文件放在被监视目录下,否则读取文件名录时会出现错误。
  2. 该脚本是一个无限循环,一旦开启会一直运行下去。可按 Ctrl + C 结束脚本运行。
  3. 该脚本运行时会产生3个临时文件:old.txtnew.txtcompare.txt。您可以在脚本运行结束后删除它们。

您可以通过标准输出重定向的方式,将发生改变的文件名录保存到一个文本文件中(如修改脚本第9行代码为 awk '$6 != $13 {print $7}' compare.txt > changed.txt),而后让 python 脚本定时读取这个文件,从中获取发生变化的文件/文件夹。

您也可以通过 xargs 命令将脚本第9行输出的文件名单作为参数传递给其他程序或脚本使用。xargs 的使用方法可参考 https://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html

希望上述方法能给您带来帮助。

2 个赞

谢谢您的详细回复,不过我已经利用ChatGPT帮我写出了需要的脚本。
:joy:

可以把解决办法发出来吗,后来者可以参考下 :smile:

我的解决办法不是监控文件变动,而是每隔一段时间找到不符合要求的文件作为Python脚本的参数来运行脚本。 :rofl: