获取大型文件列表,按文件时间排序,单位为*毫秒*

时间:2012-06-29 23:28:06

标签: php linux php-5.2

我知道我的文件系统存储文件修改时间(以毫秒为单位),但我不知道通过PHP访问该信息的方法。当我做ls --full-time时,我看到了这一点:

-rw-r--r-- 1 nobody nobody 900 2012-06-29 14:08:37.047666435 -0700 file1
-rw-r--r-- 1 nobody nobody 900 2012-06-29 14:08:37.163667038 -0700 file2

我假设点后面的数字是毫秒。

所以我意识到我可以使用ls并按修改时间排序,如下所示:

$filelist = `ls -t`;

但是,该目录有时会包含大量文件,而且我注意到在这种情况下ls可能会非常慢。

相反,我一直在使用find,但它没有按照修改时间对结果进行排序的开关。这是我现在正在做的一个例子:

$filelist = `find $dir -type f -printf "%T@ %p\n" | sort -n | awk '{print $2}'`;

当然,这并没有排到毫秒级,因此在同一秒创建的文件有时会以错误的顺序列出。

1 个答案:

答案 0 :(得分:6)

只有少数文件系统(如EXT4)实际存储的时间精确到纳秒级。这不是保证可用的,在其他文件系统(如EXT3)上你会注意到小数部分是.000000000

现在,如果此功能对您非常重要,您可以编写专门的PHP扩展。这将绕过对外部实用程序的调用,应该会更快。许多地方都很好地解释了创建扩展的过程,例如here。这种扩展的合理方法可能是替代的fstat函数实现,它公开了现在在/usr/include/bits/stat.h中定义的stat结构中可用的高精度字段。

像往常一样,没有什么是免费的。必须维护此扩展,可能无法在托管环境等上运行它。此外,您的php解决方案将仅在部署了扩展的服务器上运行(尽管可以通过回退基于ls的技术来避免如果未检测到扩展名。)