Cómo ordenar archivos por última vez modificada en ruby?


¿Cómo obtener archivos en el último orden de tiempo modificado en ruby? Fui capaz de romper mi teclado lo suficiente para lograr esto:

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 una forma más sofisticada de hacer esto?

Author: Joni, 2011-01-19

3 answers

Qué tal 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) }
 54
Author: Phrogz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-30 11:21:15

Un problema real con esto es que los sistemas de archivos basados en *nix no mantienen los tiempos de creación de archivos, solo los tiempos de modificación.

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

También, ctime no significa "tiempo de creación", es" tiempo de cambio", que es el tiempo de cambio de la información del directorio QUE APUNTA al archivo.

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

 10
Author: the Tin Man,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-19 20:36:58

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

 3
Author: scragz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-19 19:54:39