我需要为上周修改过的目录中的所有文件分配一个变量。我知道如何对项目进行排序,但我不知道如何仅在过去一周内获取文件。
files_sorted_by_time = Dir['*'].sort_by{ |f| File.mtime(f) }.reverse
我知道它与 Time.now 或类似的东西有关。谢谢!
Ruby 的Find
类使得从起始路径进行递归下降搜索变得容易:
require 'find'
LAST_WEEK = Time.now - (7 * 24 * 60 * 60)
abort "Missing path to search" if ARGV.empty?
puts "Scanning for files modified since #{ LAST_WEEK }"
week_old_files = []
Find.find(ARGV.shift) do |path|
if FileTest.directory?(path)
if File.basename(path)[0] == ?.
Find.prune # Don't look any further into hidden directories.
else
next
end
else
mod_time = File.mtime(path)
week_old_files << [mod_time, path] if mod_time >= LAST_WEEK
end
end
puts week_old_files.map{ |a| '%s : %s' % a }
运行返回如下内容:
Scanning for files modified since 2013-07-25 19:23:36 -0700
2013-08-01 09:05:22 -0700 : /Users/Cthulhu/Desktop/.DS_Store
2013-08-01 19:23:26 -0700 : /Users/Cthulhu/Desktop/test.rb
注意:这下降到子目录,并且是许多基于磁盘的实用程序的基础。为避免下降,您可以修剪找到的每个目录:
if FileTest.directory?(path)
Find.prune
else
mod_time = File.mtime(path)
week_old_files << [mod_time, path] if mod_time >= LAST_WEEK
end
您可能想使用select
. 此外,604800 是一周中的分钟数。我不确定这是否合法使用。
files_sorted_by_time = Dir['*'].select {
|f| ((Time.now - File.mtime(f)).to_i / 604800) < 7 }