有效地扫描目录树的日期


Scan directory tree efficiently by date

在php中获取给定日期之后的新文件列表的最有效方法是什么,或者可能使用系统调用?

当我收到文件时,我可以完全控制文件的存储方式,所以我认为可能将它们存储在像年/月/日/文件名这样的文件夹结构中是最好的,然后我所要做的就是扫描大于或等于我想要使用scandir检索的日期的目录,并将目录名称转换为int值。但我不确定我是否错过了一些能让这更容易/更快的东西。我对最有效的方法很感兴趣,因为随着时间的推移会有很多文件生成,我不想重新扫描旧目录。基本上,目录结构应该能很好地进行有效的手动过滤,但我想检查一下,看看我是否遗漏了什么。

简单用法示例:

'2012/12/1' contains files test1.txt, test2.txt
'2012/12/2' => test3.txt, test4.txt
'2011/11/1' => test5.txt
'2011/11/2' => test6.txt

如果我在2011年11月2日或之后搜索文件,那么我希望返回除test5.txt以外的所有文件。

提前感谢任何见解!

编辑:文件的存储和实际处理是两个独立的过程,所以我不能直接处理它们,这显然是最好的解决方案。

一般来说,我创建像YYYY/MM/DD这样的目录来存储我的文件,通常为不同的源设置另一个级别。有时我会用YYYY-MM/DD或者类似的东西。请注意,十年只有3652天,所以你甚至可以有一个像YYYY-MM-DD这样的单一级别,而不是得到太大的目录,因为它们很难处理。如果您有一个索引目录的文件系统,那么您可以轻松地在一个目录中包含成千上万个文件,否则1000个可能应该是您的上限。

为了处理文件,我不需要对目录名进行任何实际的搜索。因为我知道我感兴趣的日期,所以我可以简单地生成路径并只扫描包含在适当日期范围内的文件的目录。

例如,假设我想处理过去一周的所有文件:

for $date = today() - 7 to today():
    $path = strftime("%Y/%m/%d", $date)
    for $filename in getFiles($path):
        processFile($path, $filename)

从你写路径的方式来看,你是在linux还是mac上。

find命令可以返回在特定日期内被修改(或访问)的文件列表。

// find files that were modified less than 30m ago
$filelist = system("find /path/to/files -type f -mmin -30"); 
我认为系统调用应该少用,因为它们降低了可移植性。

存储在目录中是有意义的,因为它可以减少搜索空间。