如何将目录分类为在任何给定时间和日期之前和之后创建的文件?
我需要制作两个列表,一个是之前的文件,另一个是在某个日期/时间之后的文件。
在 OS X 上使用 Ruby 的创建时间不能通过File API 获得。一种方法是向stat(1)
. 不漂亮,但至少返回创建(又名出生)时间:
def birth(file)
Time.at(`stat -f%B "#{file}"`.chomp.to_i)
end
Dir.entries('.').sort_by {|f| birth f }
或使用给出的分区答案。
这是关于一个常见误解的详细帖子:ctime 并不意味着创建时间。
Dir["dir_path/*"].sort_by { |p| File::Stat.new(p).birthtime }
适用于 macOS
您可以使用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
是一个更好的选择。
时间
返回 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}
这是我的答案。您可以使用以下内容按照修改时间对目录中的文件进行排序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