2011-01-19 11 views
27

Jak uzyskać pliki w ostatniej modyfikacji czasu w ruby? I był w stanie rozbić moją klawiaturę wystarczy do osiągnięcia tego celu:Jak zamawiać pliki według czasu ostatniej modyfikacji w 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 } 

Ale zastanawiam się, czy istnieje bardziej wyrafinowany sposób, aby to zrobić?

Odpowiedz

53

powiesz po prostu:

# 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

Uwielbiam to w połączeniu z ostatnią metodą. 'Dir ['*. Png']. Sort_by {| f | File.ctime (f)} .last (5) ' –

+1

Dla zabawy:' posortowane = Dir ['*']. Sort_by (& File.method (: ctime)) ' – Phrogz

3

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

+2

The [Schwartzian] (http://en.wikipedia.org/wiki/Schwartzian_transform) 'sort_by' jest krótszy, [DRY] (http://en.wikipedia.org/wiki/DRY) er, i ewentualnie bardziej wydajne (przy założeniu wystarczającej liczby plików i nietrywialnym czasie wywołania metody 'ctime' dla każdego). – Phrogz

+2

Ale operator UFO jest niesamowity! – scragz

+1

Cholera, nie mogę tego obalić! +1 dla kosmicznych statków kosmicznych _ (gdy dostaję więcej głosów w ciągu 4 godzin:) _ – Phrogz

8

prawdziwy problem polega na tym, że systemy plików * nix oparte nie trzymać razy tworzenia plików, tylko czasy modyfikacji.

System Windows śledzi to, ale użytkownik jest ograniczony do tego systemu operacyjnego, próbując poprosić o pomoc podstawowy system plików.

Ponadto, ctime nie oznacza "czasu utworzenia", jest to "czas zmiany", który jest czasem zmiany informacji o katalogu POINTING do pliku.

Jeśli chcesz zmienić czas pliku, jest to mtime, który jest czasem zmiany pliku . To subtelna, ale ważna różnica.

+0

Dzięki za powiadomienie. Zmieniłem trochę pytanie, więc większość z nich odpowiada teraz na poprawne pytanie :) (Myślę, że tylko ty odpowiadałeś na prawidłowe pytanie na początku) – Joni

+0

@Joni, Nadal możesz mieć podstawowy problem w kodzie, ponieważ 'ctime 'nie jest tym samym, co' mtime'. A jeśli odpowiedzi nie odpowiadają na pytanie, nie zmieniaj pytania, rozwiń je, aby było bardziej oczywiste, czego chcesz. –

Powiązane problemy