如何在 Python 中查找修改过的文件
Posted
技术标签:
【中文标题】如何在 Python 中查找修改过的文件【英文标题】:How to find modified files in Python 【发布时间】:2014-08-30 21:40:27 【问题描述】:我想监视一个文件夹并查看是否添加了任何新文件或修改了现有文件。问题是,不能保证我的程序会一直运行(因此,基于inotify
的解决方案可能不适合这里)。我需要缓存上次扫描的状态,然后在下一次扫描时,我需要在处理文件之前将其与上次扫描进行比较。
在 Python 2.7 中实现此目的的替代方法是什么?
注意1:文件的处理成本很高,因此我正在尝试处理同时未修改的文件。所以,如果文件只是被重命名(而不是文件内容的改变),我也想检测到并跳过处理。
注意2:我只对Linux解决方案感兴趣,但如果添加其他平台的答案,我不会抱怨。
【问题讨论】:
如果你能保证你的程序将一直运行,那么它会比在它不运行时存储,然后尝试重新扫描更改要简单得多...... @JonClements 是的,但不幸的是这是不可能的。基本上,用户决定程序何时运行。这就是程序的本质。 只需创建一个包含文件名和最后修改日期的字典(您可以使用os.stat()
获取),然后将其写入文件并在每次运行时获取它
【参考方案1】:
有几种方法可以检测文件的变化。有些更容易 比别人傻。听起来这不是一个安全问题;更多的 就像假设善意一样,您只需要检测变化而无需 必须以智取胜。
您可以查看时间戳。如果文件没有被重命名,这是一个好方法
来检测变化。如果它们被重命名,单独的时间戳不会
足以可靠地将一个文件与另一个文件区分开来。 os.stat
会告诉你
上次修改文件的时间。
您可以查看 inode,例如,ls -li
。文件的 inode 号可能会改变
如果更改涉及创建新文件并删除旧文件;这是
例如,emacs
通常如何更改文件。换个文件试试
使用您的组织使用的标准工具,并比较之前的 inode
之后;但请记住,即使这次没有改变,它
在某些情况下可能会改变。 os.stat
会告诉你 inode
数字。
您可以查看文件的内容。 cksum
计算一个小的 CRC
文件校验和;如果有人愿意,很容易击败。诸如此类的程序
如sha256sum
计算安全哈希;更改文件是不可行的
不改变这样的哈希。如果文件很大,这可能会很慢。
hashlib
模块将计算多种安全哈希。
如果一个文件被重命名和更改,并且它的 inode 编号发生了变化,它会 可能很难将其与以前的文件匹配 是,除非文件中的数据包含某种不可变且 唯一标识符。
考虑并发性。有没有可能有人会改变 程序运行时的文件?小心竞争条件。
【讨论】:
【参考方案2】:我可能会使用某种 sqlite 解决方案,例如编写最后一次轮询时间。 然后在每次这样的轮询中,按 last_modified_time (mtime) 对文件进行排序,并获取所有 mtime 大于之前轮询的文件(如果你坚持没有要求,这个值将从 sqlite 或某种文件中取出这样的分贝)。
【讨论】:
【参考方案3】:监视新文件并不难——只需为目录中的所有文件保留一个索引节点列表或数据库。一个新文件将引入一个新的 inode。这也将帮助您避免处理重命名的文件,因为重命名时 inode 不会更改。
更难的问题是监控文件更改。如果您还存储每个 inode 的文件大小,那么显然更改的大小表示文件已更改,您无需打开和处理文件即可知道这一点。但是对于具有 (a) 先前记录的 inode 并且 (b) 大小与以前相同的文件,您将需要处理该文件(例如计算校验和)以了解它是否已更改。
【讨论】:
【参考方案4】:我建议作弊并使用系统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
【讨论】:
以上是关于如何在 Python 中查找修改过的文件的主要内容,如果未能解决你的问题,请参考以下文章