迭代一个目录中的每个文件

如何在ruby中编写循环,以便在每个文件上执行一段代码?

我是新来的ruby,我已经得出结论,做到这一点是一个做每个循环。
ruby文件将从不同于我想循环访问的目录的目录执行。

我已经尝试了Dir.foreach ,我无法得到它的工作。

正如其他人所说, Dir.foreach是一个很好的select。 但是,请注意, Dir.entriesDir.foreach将始终显示... (当前和父目录)。 你通常不想在他们身上工作,所以你可以做这样的事情:

 Dir.foreach('/path/to/dir') do |item| next if item == '.' or item == '..' # do work on real items end 

Dir.foreachDir.entries也显示目录中的所有项目 – 隐藏和非隐藏。 通常这就是你想要的,但是如果不是,你需要做一些跳过隐藏的文件和目录。

另外,你可能想看看Dir.glob ,它提供了简单的通配符匹配:

 Dir.glob('/path/to/dir/*.rb') do |rb_file| # do work on files ending in .rb in the desired directory end 

这是我最喜欢容易阅读的方法:

 Dir.glob("*/*.txt") do |my_text_file| puts "working on: #{my_text_file}..." end 

而且你甚至可以扩展它来处理子目录中的所有文件:

 Dir.glob("**/*.txt") do |my_text_file| # note one extra "*" puts "working on: #{my_text_file}..." end 

目录也有更短的语法来获取目录中的所有文件的数组:

 Dir['dir/to/files/*'].each do |fname| # do something with fname end 
 Dir.foreach("/home/mydir") do |fname| puts fname end 

查找库专为此任务而devise: http : //stdlib.rubyonrails.org/libdoc/find/rdoc/index.html

 require 'find' Find.find(path) do |file| # process end 

这是一个标准的ruby库,所以它应该是可用的

 Dir.new('/my/dir').each do |name| ... end 

我喜欢这个,上面没有提到。

 require 'pathname' Pathname.new('/my/dir').children.each do |path| puts path end 

好处是你得到一个path名对象而不是一个string,你可以做有用的东西,并进一步遍历。