2012-06-29 8 views
10

Sé que mi sistema de archivos está almacenando el tiempo de modificación del archivo en milisegundos, pero no sé de qué forma acceder a esa información a través de PHP. Cuando hago un ls --full-time veo esto:Obtenga una gran lista de archivos, ordenados por tiempo de archivo en * milisegundos *

-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 

estoy suponiendo que los números después del punto son los milisegundos.

Así que se dan cuenta de que sólo podía utilizar ls y tienen que ordenar por fecha de modificación, así:

$filelist = `ls -t`; 

Sin embargo, el directorio tiene a veces un número masivo de archivos y me he dado cuenta de que puede haber ls bastante lento en esas circunstancias.

En su lugar, he estado usando find pero no tiene un interruptor para ordenar los resultados por tiempo de modificación. Aquí está un ejemplo de lo que estoy haciendo ahora:

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

Y, por supuesto, esto no hace sort a los milisegundos lo que los archivos que se crearon en el mismo segundo a veces se enumeran en el orden equivocado.

+1

¿Por qué 'sort -n' no ordena a los milisegundos? Me parece que dos marcas de tiempo '1341013506.3000000000' y' 1341013506.6000000000' se ordenarían numéricamente ¿no? No puedo replicar porque mi máquina no almacena ms veces de archivos :) –

+1

@mattedgod: revisa tu directorio '/ sys /'; en mi sistema, es compatible con nanosegundos veces. – sarnold

+0

@sarnold Hmm, es extraño, el directorio sys está en nanosegundos, pero la mayoría de los directorios de documentos no lo son. Interesante ... –

Respuesta

6

Solo unos pocos sistemas de archivos (como EXT4) realmente almacenan estos tiempos hasta una precisión de nanosegundos. No es algo que esté garantizado, en otros sistemas de archivos (como EXT3) notará que la parte fraccionaria es .000000000

Ahora, si esta función es realmente importante para usted, podría escribir una extensión PHP especializada. Esto evitará las llamadas a servicios externos y debería ser mucho más rápido. El proceso de creación de extensiones está bien explicado en muchos lugares, como here. Un enfoque razonable para tal extensión podría ser una implementación alternativa de la función fstat que expone los campos de alta precisión disponibles en la estructura estadística definida en /usr/include/bits/stat.h hoy en día.

Como de costumbre, nada es gratis. Esta extensión deberá mantenerse, probablemente no sea posible ejecutarla en entornos alojados, etc. Además, su solución php solo se ejecutará en los servidores donde se implementó su extensión (aunque eso se puede eludir recurriendo a la técnica basada en ls). si la extensión no se detecta).

+0

tuve la sensación de que no iba a haber una solución simple para esto. Gracias por compartir tus pensamientos. :-) – Jeremy

Cuestiones relacionadas