通过过滤器将一个目录中的文件传递到另一个目录中

通过过滤器将一个目录中的文件传递到另一个目录中

我有一个充满文件的目录。

我希望最初通过命令传递每个文件,然后将输出发送到不同目录中的另一个文件,如下所示:

cat dir1/sourcefile | process.py > dir2/destfile

“destfile”的名称并不重要,它可以是任何文件名。

然而,这很容易——新文件一直在被添加到 dir1,并且现有文件偶尔会被修改。

我如何编写一个 bash 脚本(或其他类型的脚本)来监视 dir1,并且每当添加或修改新文件时,对其进行处理或将其重新处理到 dir2 中?

答案1

借助 Google 魔法,找到

您没有指定正在使用的操作系统或发行版,但在 Ubuntu 下,inotify-tools 包包含 inotifywait 和 inotifywatch:

inotifywait - wait for changes to files using inotify
inotifywatch - gather filesystem access statistics using inotify

因此,为了您的使用,您可能想要更类似的东西:

#!/bin/sh
while inotifywait -e modify /dir1; do
for i in `ls -1 /dir1`
do process.py /dir1/$i > /dir2/$i.processed; done
done

(抱歉,今晚我的体力很弱)

如果您没有快速创建文件,您可能可以修剪内部循环......

答案2

在 Linux 中,您可以使用 inotify 获取目录更改或文件更改的事件。不幸的是,没有命令行实用程序可以支持 bash 脚本的此功能……至少据我所知没有。

但是,有一个针对 inotify API 的 Python 绑定,通知通知。由于您已经在使用 python,对于您的处理实用程序,也许这适合您。

答案3

正如 KFro 所建议的,最优雅的方法是使用 PyInotify。

但一种蛮力的方法是编写一个 Python 脚本,使用os.walk访问所有文件,并跟踪哪些文件已经在字典中出现过;然后使用 time.sleep() 睡眠一段时间,然后再次运行 os.walk,查看哪些文件尚未出现在字典中,并进行适当的更新。

要跟踪已更新的文件,您可以使用 os.stat() 获取文件上次更新的时间戳,并将其存储在字典中。事实上,这就是字典中真正需要的内容:完整文件名(包括路径)作为键,时间戳作为值。

虽然不如 PyInotify 优雅,但它应该可以在任何 Python 可以运行的地方工作。

相关内容