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

发布于 2024-10-06 01:13:30 字数 170 浏览 4 评论 0原文

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

示例:

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

谢谢。

Is it possible to set a limit on Dir.each method? I would like to retrieve only last 10 files (ordered by create date).

Example:

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

Thx.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

坦然微笑 2024-10-13 01:13:30

这是要求底层操作系统完成繁重工作可能会更有效的时候之一,特别是当您梳理大量文件时:

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

在将打开 shell 的 Mac 操作系统上,对所有“*.json”进行排序' 按文件的创建日期倒序排列,返回最后十个。名称将以字符串形式返回,因此 split 会在行尾将它们分解为数组。

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

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

This is one of those times when it might be more efficient to ask the underlying OS to do the heavy lifting, especially if you're combing through a lot of files:

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

On Mac OS that will open a shell, sort all '*.json' files by their creation date in reverse order, returning the last ten. The names will be returned in a string so split will break them into an Array at the line-ends.

The ls and tail commands are really fast and doing their work in compiled C code, avoiding the loops we'd have to do in Ruby to filter things out.

The downside to this is it's OS dependent. Windows can get at creation data but the commands are different. Linux doesn't store file creation date.

伴我心暖 2024-10-13 01:13:30

ctime 的最后 10 个文件...


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

第二个 #map{} 只是删除了 ctime 对象,因此如果您不介意直接使用 [ctime, fname]< 数组/code> 你可以把它去掉。

The last 10 files by ctime...


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

The second #map{} just strips off the ctime objects so if you don't mind working directly with the array of [ctime, fname] you can leave it off.

淡淡離愁欲言轉身 2024-10-13 01:13:30

尝试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

创建一个基于日期的常规命名系统。

Try 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

And create a script to use the .atime
http://ruby-doc.org/core/classes/File.html#M002547

to create a conventional naming system based on date.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文