我有一个充满文件的目录。
我想通过一个命令初始传递这些文件中的每一个,并将输出发送到不同目录中的另一个文件,如下所示:
cat dir1/sourcefile | process.py > dir2/destfile
“destfile”的名字是不重要的,它可以是任何文件名。
然而,很简单 – 新文件一直被添加到dir1,现有的文件偶尔被修改。
我该如何编写一个bash脚本(或其他types的脚本)来关注dir1,每当添加或修改一个新文件,处理它或将其重新处理成dir2?
带着一点Google魔法,find了这个
您不指定使用哪个操作系统或发行版,但在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
(对不起,今晚我屁股很弱)
如果你不是快速创build文件,你可能会修剪出内部循环…
在Linux中,您可以使用inotify来获取目录更改或文件更改的事件。 不幸的是,没有命令行工具可以支持这个bash脚本…至less没有我知道的。
但是, Inotify API PyInotify有一个Python绑定。 由于您已经在使用python,因此您的处理实用程序可能适合您。
正如KFro所build议的那样,PyInotify最优雅的方式。
但是一个powershell的方法是编写一个使用os.walk来访问所有文件的Python脚本,并且跟踪哪些文件已经在字典中被看到; 然后使用time.sleep()hibernate一会儿,然后再次运行os.walk,查看哪些文件不在字典中,然后进行适当的更新。
为了跟踪已更新的文件,可以使用os.stat()获取文件上次更新的时间戳,并将其存储在字典中。 实际上,这就是字典中所需要的全部内容:完整的文件名(包括path)作为关键字,时间戳记作为值。
几乎不像PyInotify那么优雅,但它应该在Python工作的任何地方工作。