0

我需要为上周修改过的目录中的所有文件分配一个变量。我知道如何对项目进行排序,但我不知道如何仅在过去一周内获取文件。

files_sorted_by_time = Dir['*'].sort_by{ |f| File.mtime(f)  }.reverse

我知道它与 Time.now 或类似的东西有关。谢谢!

4

2 回答 2

0

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
于 2013-08-02T02:27:05.267 回答
0

您可能想使用select. 此外,604800 是一周中的分钟数。我不确定这是否合法使用。

files_sorted_by_time = Dir['*'].select { 
  |f| ((Time.now - File.mtime(f)).to_i / 604800) < 7 }
于 2013-08-02T01:30:56.160 回答