如何将目录排序到在任何给定时间和日期之前和之后创建的文件中?
我需要制作两个列表,一个是之前的文件,另一个是文件之后的某个日期/时间。
答案 0 :(得分:3)
通过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 :(得分:1)
您可以使用Enumerable#partition
:
files = Dir.entries('.')
time = Time.parse("2013-09-01")
before, after = files.partition { |file| File.ctime(file) < time }
正如Tin Man所说,ctime
并不是唯一的文件时间方法。也许atime
或mtime
是更好的选择。
答案 2 :(得分:0)
的ctime
返回stat的更改时间(即时间目录 有关文件的信息已更改,而不是文件本身。
请注意,在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}
答案 3 :(得分: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
答案 4 :(得分:0)
Dir["dir_path/*"].sort_by { |p| File::Stat.new(p).birthtime }
适用于macos