2011-01-19 25 views
27

Làm cách nào để nhận các tệp theo thứ tự thời gian được sửa đổi lần cuối trong ruby? Tôi đã có thể đập vỡ bàn phím đủ để đạt được điều này:Làm thế nào để đặt hàng các tập tin theo thời gian sửa đổi lần cuối trong 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 } 

Nhưng tôi tự hỏi liệu có cách nào phức tạp hơn để làm điều này không?

Trả lời

53

Làm thế nào về đơn giản:

# 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

Yêu thích kết hợp với phương pháp cuối cùng. 'Dir ['*. Png']. Sort_by {| f | File.ctime (f)} .last (5) ' –

+1

Để giải trí:' được sắp xếp = Dir ['*']. Sort_by (& File.method (: ctime)) ' – Phrogz

3

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

+2

[Schwartzian] (http://en.wikipedia.org/wiki/Schwartzian_transform) 'sort_by' ngắn hơn, [DRY] (http://en.wikipedia.org/wiki/DRY) er, và có thể hiệu quả hơn (giả sử đủ tệp và thời gian không tầm thường để gọi phương thức 'ctime' cho mỗi tệp). – Phrogz

+2

Nhưng nhà điều hành UFO là awesomer! – scragz

+1

Chết tiệt, tôi không thể bác bỏ điều đó! 1 cho tàu không gian awesomer _ (khi tôi nhận được nhiều phiếu bầu trong 4 giờ:) _ – Phrogz

8

Một vấn đề thực sự với điều này là hệ thống tập tin * nix dựa không giữ lần tạo cho các tập tin, chỉ có lần sửa đổi.

Windows theo dõi nó, nhưng bạn bị giới hạn ở hệ điều hành đó với bất kỳ nỗ lực nào để yêu cầu hệ thống tệp cơ bản trợ giúp.

Ngoài ra, ctime không có nghĩa là "thời gian tạo", đó là "thời gian thay đổi", là thời gian thay đổi của thông tin thư mục ĐIỂM vào tệp.

Nếu bạn muốn thời gian sửa đổi của tệp, đó là mtime, đây là thời gian thay đổi của tệp . Đó là một sự khác biệt tinh tế nhưng quan trọng.

+0

Cảm ơn đã thông báo. Tôi đã thay đổi câu hỏi một chút để hầu hết trong số họ bây giờ trả lời cho câu hỏi đúng :) (Tôi nghĩ rằng bạn chỉ trả lời đúng câu hỏi ngay từ đầu) – Joni

+0

@Joni, Bạn vẫn có thể có một vấn đề cơ bản trong mã vì 'ctime 'không giống với' mtime'. Và, nếu các câu trả lời không trả lời câu hỏi, không thay đổi câu hỏi, mở rộng câu hỏi để nó rõ ràng hơn những gì bạn muốn. –

Các vấn đề liên quan