在不读取所有内容的情况下找到目录中最新的文件

4 投票
4 回答
1728 浏览
提问于 2025-04-16 10:05

我正在尝试在一个巨大的文件系统中找到最新的文件。一个方法是逐个目录地查看,读取里面的内容,选出最新的文件等等。

显而易见的问题是,我必须获取特定目录中的所有文件。我在想,Python中是否有一个“魔法”调用,像Unix那样,可以直接获取目录中最新的文件。

[1]. 我的应用程序是用Python写的,但如果标准库中没有现成的解决方案,请提供使用系统调用的C语言替代方案。我愿意写一个C扩展来实现这个功能。

谢谢

更新: 我想我应该解释一下为什么inotify类型的解决方案对我不适用。我只是想找一个使用Python/C的系统调用,能够给我最新的文件。是的,可以使用inotify(或类似的监控系统)来监控文件系统的变化,但在一个随机目录中,我该如何找到最新的文件,这才是问题的核心。

4 个回答

3

在Unix系统中,没有通用的接口可以做到这一点。大多数文件系统并不会根据文件的修改时间(mtime)或创建时间(ctime)来索引目录里的文件。所以即使有这样的接口,它的速度也可能不会比你自己去做更快。

7

你有没有考虑过使用 pyinotify 呢?这个工具可以监视一个文件夹及其子文件夹的变化。
这可能需要你把代码做成多线程的,也就是说,可以创建一个专门的监视线程,记录最新的变化,然后让主线程去查看这些变化。

另外,你也可以使用 popen 命令,获取 'ls -t | head -1' 的结果。

5

我认为一般来说,'Unix' 或 Posix 系统并不支持一种可以跨平台使用的文件系统变更通知。

不过,有很多类Unix系统是支持的:

  • OS X
    • FSEvents(文件系统事件)
    • fslogger(文件系统日志记录工具)
    • DTrace(动态追踪工具) + 系统调用
    • pnotify(通知工具)
    • Kqueue(事件通知机制)
  • Linux:
    • inotify(文件系统事件监控工具)
    • pnotify(通知工具)
    • epoll(事件轮询机制)
  • Solaris
    • DTrace(动态追踪工具)
  • BSD
    • pnotify(通知工具)
    • Kqueue(事件通知机制)
  • Python:
    • Kqueue 在Python中仅在BSD上直接支持
    • Pyinotify 仅在Linux上可用
    • FSEvents 仅在Darwin / OS X上可用
    • Gamin 仅在Linux和BSD上可用

还有人建议尝试解析 ls 的输出。别这样做。如果你想用Unix工具,大多数Unix / Linux / Posix系统都有 stat 这个工具。stat工具的输出是可以配置的,你可以设置想要解析的字段。它是GNU核心工具的一部分。

撰写回答