2011-01-19 7 views
27

Come ottenere i file nell'ultimo ordine di tempo modificato in ruby? Sono stato in grado di distruggere la mia tastiera abbastanza per raggiungere questo obiettivo:Come ordinare i file in base all'ora dell'ultima modifica in 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 } 

Ma mi chiedo se non v'è più sofisticato modo per fare questo?

risposta

53

ne dite semplicemente:

# 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

Mi è piaciuto molto questo in combinazione con l'ultimo metodo. 'Dir ['*. Png']. Ordina_by {| f | File.ctime (f)} .last (5) ' –

+1

Per divertimento:' ordinato = Dir ['*']. Sort_by (& File.method (: ctime)) ' – Phrogz

3

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

+2

Lo [Schwartzian] (http://en.wikipedia.org/wiki/Schwartzian_transform) 'sort_by' è più corto, [DRY] (http://en.wikipedia.org/wiki/DRY) er, e possibilmente più efficiente (assumendo abbastanza file e un tempo non trascurabile per invocare il metodo 'ctime' per ciascuno). – Phrogz

+2

Ma l'operatore UFO è fantastico! – scragz

+1

Accidenti, non posso smentirlo! +1 per astronavi awesomer _ (quando ottengo più voti in 4 ore:) _ – Phrogz

8

Un vero e proprio problema di questo è che i file system * nix basati non mantengono tempi di creazione per i file, solo i tempi di modifica.

Windows lo tiene traccia, ma si è limitati a tale sistema operativo con qualsiasi tentativo di chiedere aiuto al file system sottostante.

Inoltre, ctime non significa "tempo di creazione", è "tempo di modifica", che è il tempo di modifica delle informazioni della directory PUNTO al file.

Se si desidera l'ora di modifica del file, è mtime, che è il tempo di modifica del file . È una differenza sottile ma importante.

+0

Grazie per l'avviso. Ho cambiato la domanda un po 'così la maggior parte di loro ora risponde alla domanda corretta :) (Penso che tu fossi l'unica a rispondere alla domanda corretta all'inizio) – Joni

+0

@ Joni, potresti ancora avere un problema di base nel codice perché 'ctime 'non è lo stesso di' mtime'. E, se le risposte non rispondono alla domanda, non cambiare la domanda, espanderla, quindi è più evidente ciò che desideri. –

Problemi correlati