![通过过滤器将一个目录中的文件传递到另一个目录中](https://linux22.com/image/493050/%E9%80%9A%E8%BF%87%E8%BF%87%E6%BB%A4%E5%99%A8%E5%B0%86%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6%E4%BC%A0%E9%80%92%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95%E4%B8%AD.png)
我有一个充满文件的目录。
我希望最初通过命令传递每个文件,然后将输出发送到不同目录中的另一个文件,如下所示:
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 可以运行的地方工作。