在目录中查找最新文件而不读取其中的所有内容

时间:2011-01-17 04:07:19

标签: python c unix

我正试图找出一个庞大的文件系统中的最新文件。一种方法是遍历所有目录 - 一次一个,读取其内容,选择最新文件等。

明显的缺点是我必须在特定目录中获取所有文件。我想知道在Python [1]中是否有一个“魔术”调用,Unix支持它只获取目录中的最新文件。

[1]。我的应用程序是在Python中,但如果stdlib中不存在现成的解决方案,请使用系统调用提供C(语言)备选方案。我愿意写一个C-extension并使其成功。

由于

更新:我想我应该解释为什么inotify类型解决方案对我不起作用。我只是在寻找使用Python / C的系统调用,它可以给我最新的文件。是的,人们可以通过inotify(或类似的总体设置)来监控FS的变化,但是给定一个随机目录如何找到最新的文件是问题的本质。

4 个答案:

答案 0 :(得分:7)

您是否考虑使用可以查看目录和子目录的pyinotify? 这可能需要您的代码是线程化的,例如,一个观察者线程记录主要线程的最新更改以进行轮询。

或者,您可以使用popen并获得'ls -t |的结果头-1'

答案 1 :(得分:5)

我不相信通常'Unix'或Posix系统支持平台无关的文件系统更改通知。

也就是说,有很多unixy系统可以做到:

其他人建议尝试解释ls。不要那样做。如果你觉得有必要使用Unix工具,那么大多数Unix / Linux / Posix版本也有stat作为实用工具。 stat utility具有可配置的输出,您可以设置要解析的字段。它是GNU核心实用程序的一部分。

答案 2 :(得分:3)

在Unix中不存在可执行此操作的可移植API。大多数文件系统都不会通过mtime(或ctime)索引目录中的文件,所以即使它确实如此,也可能不会比自己动手更快。

答案 3 :(得分:-3)

您不必使用Python来完成此任务,将python包装在更好地理解文件系统的Unix实用程序上,并且可以为您提供此信息。 例如,

在该目录上执行ls -ltr |tail -1,结果将是字符串,将其拆分并获取您要查找的文件的最后一项。

import subprocess
targetdir = 'foo'
#ls -ltr |tail -1

list_reverse = subprocess.Popen(['ls','-t',targetdir],stdout=subprocess.PIPE)
tail_call = subprocess.Popen(['head','-1'],stdin=list_reverse.stdout,stdout=subprocess.PIPE)
out,err = tail_call.communicate()
print out.split()[-1]