2011-01-19 11 views
27

¿Cómo obtener archivos en la última orden de tiempo modificada en ruby? Yo era capaz de romper mi teclado suficiente para lograr esto:¿Cómo ordenar archivos por última vez modificada en ruby?

file_info = Hash[*Dir.glob("*").collect {|file| [file, File.ctime(file)]}.flatten] 
sorted_file_info = file_info.sort_by { |k,v| v} 
sorted_files = sorted_file_info.collect { |file, created_at| file } 

Pero me pregunto si hay forma más sofisticada de hacer esto?

Respuesta

53

¿Qué hay de simplemente:

# If you want 'modified time', oldest first 
files_sorted_by_time = Dir['*'].sort_by{ |f| File.mtime(f) } 

# If you want 'directory change time' (creation time for Windows) 
files_sorted_by_time = Dir['*'].sort_by{ |f| File.ctime(f) } 
+1

Me encantó esto en combinación con el último método. 'Dir ['*. Png']. Sort_by {| f | File.ctime (f)} .last (5) ' –

+1

Por diversión:' sorted = Dir ['*']. Sort_by (& File.method (: ctime)) ' – Phrogz

3

Dir.glob("*").sort {|a,b| File.ctime(a) <=> File.ctime(b) }

+2

La [Schwartzian] (http://en.wikipedia.org/wiki/Schwartzian_transform) 'sort_by' es más corta, [DRY] (http://en.wikipedia.org/wiki/DRY) er, y posiblemente más eficiente (suponiendo que hay suficientes archivos y un tiempo no trivial para invocar el método 'ctime' para cada uno). – Phrogz

+2

¡Pero el operador de OVNIs es asombroso! – scragz

+1

Maldita sea, ¡no puedo refutar eso! +1 para naves espaciales awesomer _ (cuando obtengo más votos en 4 horas:) _ – Phrogz

8

un verdadero problema con esto es que los sistemas de ficheros * nix basado no mantienen horas de creación de archivos, sólo los tiempos de modificación.

Windows hace un seguimiento, pero está limitado a ese sistema operativo con cualquier intento de pedir ayuda al sistema de archivos subyacente.

Además, ctime no significa "tiempo de creación", es "hora de cambio", que es el tiempo de cambio de la información de directorio SEÑALANDO al archivo.

Si desea la hora de modificación del archivo, es mtime, que es el tiempo de cambio del archivo . Es una diferencia sutil pero importante.

+0

Gracias por su aviso. Cambié la pregunta un poco para que la mayoría de ellos respondan la pregunta correcta :) (Creo que usted fue la única que respondió la pregunta correcta al principio) – Joni

+0

@Joni, todavía podría tener un problema básico en el código porque 'ctime 'no es lo mismo que' mtime'. Y, si las respuestas no responden a la pregunta, no cambie la pregunta, amplíela para que sea más evidente lo que desea. –

Cuestiones relacionadas