如何在Python中查找修改过的文件

时间:2014-08-30 21:40:28

标签: python python-2.7 inotify

我想监视一个文件夹,看看是否添加了任何新文件,或者是否修改了现有文件。问题是,我不保证我的程序会一直运行(因此,基于inotify的解决方案可能不适合这里)。我需要缓存上次扫描的状态,然后在下一次扫描时,我需要在处理文件之前将其与上一次扫描进行比较。

在Python 2.7中实现这一目标有哪些替代方案?

注意1:处理文件很昂贵,所以我正在尝试处理同时未修改的文件。因此,如果仅重命名文件(而不是文件内容的更改),我还想检测并跳过处理。

注意2:我只对Linux解决方案感兴趣,但如果添加其他平台的答案,我不会抱怨。

4 个答案:

答案 0 :(得分:1)

监视新文件并不困难 - 只需保留目录中所有文件的inode列表或数据库。一个新文件将引入一个新的inode。这也可以帮助您避免处理重命名的文件,因为inode在重命名时不会更改。

更难的问题是监控文件更改。如果您还存储每个inode的文件大小,那么显然更改的大小表示已更改的文件,您不需要打开并处理该文件以了解该文件。但对于具有(a)先前记录的inode的文件,以及(b)与之前相同的大小,您将需要处理该文件(例如,计算校验和)以了解它是否已更改。

答案 1 :(得分:1)

有多种方法可以检测文件中的更改。有些更容易 傻瓜比别人。听起来这不是一个安全问题;更多 假设有诚意,你只需要在没有的情况下检测变化 不得不战胜对手。

您可以查看时间戳。如果没有重命名文件,这是一个好方法 检测变化。如果它们被重命名,那么单独的时间戳就不会 足以可靠地告诉另一个文件。 os.stat会告诉你 文件上次修改的时间。

您可以查看inode,例如ls -li。文件的inode编号可能会更改 如果更改涉及创建新文件并删除旧文件;这是 例如,emacs通常如何更改文件。尝试更改文件 使用组织使用的标准工具,并比较之前的inode 之后;但请记住,即使这次不改变,它也是如此 在某些情况下可能会改变。 os.stat会告诉你inode 号。

您可以查看文件的内容。 cksum计算一个小CRC 校验和文件;如果有人愿意,它很容易被击败。程序等 as sha256sum计算安全哈希;更改文件是不可行的 没有改变这样的哈希。如果文件很大,这可能会很慢。 hashlib模块将计算几种安全哈希值。

如果文件被重命名和更改,并且其inode编号发生变化,则会发生变化 可能很难将其与以前的文件相匹配 除非文件中的数据包含某种不可变的和 唯一标识符。

考虑并发性。有人可能会改变一个 程序运行时的文件?小心竞争条件。

答案 2 :(得分:0)

我可能会选择某种sqlite解决方案,例如写下最后一次轮询时间。 然后在每个这样的轮询上,按last_modified_time(mtime)对文件进行排序,并获取所有mtime大于上一次轮询的人(如果你坚持没有要求,这个值将从sqlite或某种文件中取出这样的数据库)。

答案 3 :(得分:0)

我建议作弊并使用系统find命令。例如,以下内容查找在过去60分钟内已修改或创建的所有Python文件。使用ls输出可以确定是否需要进一步检查。

$ echo beer > zoot.py
$ find . -name '*.py' -mmin -60 -type f -ls
1973329    4 -rw-r--r--   1 johnm    johnm           5 Aug 30 15:17 ./zoot.py