Получить большой список файлов, отсортированных по времени файла в * миллисекундах *

Я знаю, что моя файловая система хранит время изменения файла в миллисекундах, но я не знаю, как получить доступ к этой информации через 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 "%[email protected] %p\n" | sort -n | awk '{print $2}'`;

И, конечно же, это не сортируется до миллисекунд, поэтому файлы, созданные за одну секунду, иногда перечисляются в неправильном порядке.

Ответ 1

Только несколько файловых систем (например, EXT4) фактически сохраняют эти моменты до точностью до наносекунд. Это не то, что гарантировано будет доступно, в других файловых системах (например, EXT3) вы заметите, что дробная часть .000000000

Теперь, если эта функция действительно важна для вас, вы можете написать специализированное расширение PHP. Это приведет к обходу вызовов внешним утилитам и будет намного быстрее. Процесс создания расширения хорошо объясняется во многих местах, например здесь. Разумным подходом к такому расширению может быть альтернативная реализация функции fstat, которая предоставляет высокоточные поля, доступные в структуре stat, определенные в /usr/include/bits/stat.h в настоящее время.

Как обычно, ничто не является бесплатным. Это расширение должно быть сохранено, возможно, невозможно запустить его в размещенных средах и т.д. Кроме того, ваше php-решение будет работать только на серверах, на которых было развернуто ваше расширение (хотя это можно обойти, отказавшись от технологии на основе ls если расширение не обнаружено).