我有一个充满文件的目录。
我想最初通过命令传递每个文件,并将输出发送到不同目录中的另一个文件,如下所示:
cat dir1/sourcefile | process.py > dir2/destfile
“destfile”的名称并不重要,它可以是任何文件名。
然而,这很容易——新文件一直被添加到 dir1 中,并且偶尔会修改现有文件。
如何编写一个 bash 脚本(或其他类型的脚本)来关注 dir1,并且每当添加或修改新文件时,对其进行处理或将其重新处理到 dir2 中?
我有一个充满文件的目录。
我想最初通过命令传递每个文件,并将输出发送到不同目录中的另一个文件,如下所示:
cat dir1/sourcefile | process.py > dir2/destfile
“destfile”的名称并不重要,它可以是任何文件名。
然而,这很容易——新文件一直被添加到 dir1 中,并且偶尔会修改现有文件。
如何编写一个 bash 脚本(或其他类型的脚本)来关注 dir1,并且每当添加或修改新文件时,对其进行处理或将其重新处理到 dir2 中?
用一点谷歌魔法,找到了这个
您没有指定您正在使用哪个操作系统或发行版,但在 Ubuntu 下,inotify-tools 软件包包含 inotifywait 和 inotifywatch:
所以,为了您的使用,您需要更多类似的东西:
(对不起,今晚我的bash fu很弱)
如果你没有快速创建文件,你可能会修剪掉内循环......
在 linux 中,您可以使用 inotify 来获取目录更改或文件更改的事件。不幸的是,没有命令行实用程序可以支持 bash 脚本......至少我不知道。
但是,有一个用于 inotify API PyInotify的 Python 绑定。由于您已经在使用 python,对于您的处理实用程序,也许这适合您。
正如 KFro 建议的那样,最优雅的方法是使用 PyInotify。
但是一个蛮力的方法是编写一个使用os.walk访问所有文件的 Python 脚本,并跟踪哪些文件已经在字典中看到过;然后使用 time.sleep() 睡一会儿,然后再次运行 os.walk,查看哪些文件不在字典中,并进行适当的更新。
要跟踪已更新的文件,您可以使用 os.stat() 获取文件上次更新时间的时间戳,并将其存储在字典中。事实上,这就是您在字典中真正需要的全部内容:完整文件名(包括路径)作为键,时间戳作为值。
不像 PyInotify 那样优雅,但它应该可以在 Python 工作的任何地方工作。