Ruby Dir ['** / *']限制?

时间:2010-12-06 04:41:34

标签: ruby-on-rails ruby file glob

是否可以对Dir.each方法设置限制?我想只检索最后10个文件(按创建日期排序)。

示例:

Dir[File.join(Rails.root, '*.json'), 10].each do |f|
  puts f
end 

THX。

3 个答案:

答案 0 :(得分:4)

这是其中一个时候,要求底层操作系统执行繁重工作可能会更有效,特别是如果你正在梳理很多文件:

%x[ls -rU *.json | tail -10].split("\n")

在将打开shell的Mac OS上,按其创建日期按相反顺序对所有'* .json'文件进行排序,返回最后十个。名称将以字符串形式返回,因此split会将它们分成行末端的数组。

lstail命令非常快,并且在编译的C代码中完成它们的工作,避免了我们在Ruby中必须做的循环来过滤掉事情。

这方面的缺点是它取决于操作系统。 Windows可以获取创建数据但命令不同。 Linux不存储文件创建日期。

答案 1 :(得分:2)

ctime的最后10个文件......


Dir['*'].map { |e| [File.ctime(e), e] }.sort.map { |a| a[1] }[-10..-1]

第二个#map{}只是剥离ctime对象,所以如果你不介意直接使用[ctime, fname]数组,你可以将其关闭。

答案 2 :(得分:0)

尝试each_with_index http://ruby-doc.org/core/classes/Enumerable.html#M003141

Dir[...].each_with_index do |f, i|
  break if i == 10
  puts f
end

创建一个脚本以使用.atime http://ruby-doc.org/core/classes/File.html#M002547

根据日期创建传统的命名系统。