2013-09-22 23 views
1

如何將目錄排序到在任何給定時間和日期之前和之後創建的文件?如何按創建日期組織文件?

我需要製作兩個列表,其中一個文件在之前,另一個文件在某個日期/時間之後。

+2

看看http://stackoverflow.com/questions/7389733/sort-order-in-rubys-dir-entries-method – calas

+1

你怎麼知道創建文件時?傳統的UNIX文件系統不知道。 ('ctime' /'st_ctime'不記錄文件的創建時間。) – pilcrow

+0

+1 @pilcrow。 'ctime'不能被依賴,因爲它意味着兩種不同的東西,這取決於操作系統和Ruby的版本。改爲使用'mtime'。 –

回答

2

通過File API,Ruby on OS X的創建時間不可用。其中一種方法是脫殼至stat(1)。不是很漂亮,但至少會返回創建(a.k.a出生)時間:

def birth(file) 
    Time.at(`stat -f%B "#{file}"`.chomp.to_i) 
end 

Dir.entries('.').sort_by {|f| birth f } 

或者使用給出的分區回答。

下面是一篇關於常見誤解的詳細文章:ctime does not mean creation time

+1

謝謝!你也想用帶撇號引號的#{file}來轉義,這樣你就不會遇到有空格的文件名。 :) – nemesis

+0

根據http://www.ruby-doc.org/core-2.2.0/File.html#method-c-birthtime創建時間應該可以通過File API獲得,但這似乎並不總是奏效。它適用於我的OSX,但不適用於我的Ubuntu服務器。 – Fritzz

0

的ctime

返回更改時間統計(即,有關該文件的時間目錄 信息被改變,而不是文件本身)。

請注意,在Windows(NTFS)上,返回創建時間(出生時間)。

http://www.ruby-doc.org/core-2.0.0/File/Stat.html#method-i-ctime

所以你可以做這樣的事情。

Dir.entries('.').sort {|a,b| File.stat(a).ctime <=> File.stat(b).ctime} 
+1

還有mtime,它返回修改時間而不是創建時間 – calas

+1

建議['sort_by'](http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-sort_by)而不是爲了效率,「排序」。 – pilcrow

+0

重要的是強調你不能指望可用的文件創建信息。只有Windows才能捕獲它,所以如果代碼在非Windows系統上運行,結果將會不同。因此,您應該使用'mtime',因爲這是一個更有用的值。 –

0

這是我的答案。您可以在目錄中的文件通過他們的修改時間與東西沿着這些路線使用File.new('filename').mtime

files_hash = Hash.new 

Dir.foreach('.') do |file_name| 
    modified_time = File.new(file_name).mtime 
    unless file_name == '.' || file_name == '..' then 
    files_hash[file_name] = modified_time 
    end 
end 

# Sort the hash. 
files_hash = files_hash.sort_by {|key, value| value} 

files_hash.each do |name, time| 
    puts "#{name} was modified at #{time}" 
end 
1

排序可以使用Enumerable#partition

files = Dir.entries('.') 
time = Time.parse("2013-09-01") 
before, after = files.partition { |file| File.ctime(file) < time } 

由於錫文指出,ctime不是唯一的文件時間方法。也許atimemtime是一個更好的選擇。

+1

'ctime'不是創作時間。 「 返回stat的更改時間(即有關文件的時間目錄信息已更改,而不是文件本身)。」 Linux或Mac OS都不會保留文件創建時間,只有Windows會這樣做,所以大多數語言都不會嘗試報告它。返回的值在各個操作系統中會有所不同,從而導致混淆。 'mtime'是一個更好的選擇。 –

+0

@theTinMan我在回答中添加了一條註釋。 BTW,OS X保留文件創建時間(至少在HSF捲上),但它不能作爲Ruby方法使用。 – Stefan

+0

它將其作爲擴展屬性文件中Finder信息的一部分保存爲側車文件。標準* nix OS調用無法訪問它,這就是爲什麼Ruby無法獲取它。在2.0之前的Ruby是一致的。爲什麼他們改變爲不一致的模式已經超越了我,但我認爲這是一個糟糕的決定。 –

0

Dir["dir_path/*"].sort_by { |p| File::Stat.new(p).birthtime }作品在MacOS