我如何在ruby中写一个循环,以便我可以在每个文件上执行一个代码块?
我已经尝试了Dir.foreach,我不能让它工作。
Dir.foreach
Dir.foreach("/home/mydir") do |fname| puts fname end
Dir.new('/my/dir').each do |name| ... end
正如其他人所说,Dir::foreach在这里是一个很好的选择。然而,请注意Dir::foreach和Dir::entries将始终包含.和..(当前和父目录)。你通常不想处理它们,所以你可以使用Dir::each_child或Dir::foreach0(作为Dir::foreach1)或这样做:
Dir::foreach
Dir::entries
.
..
Dir::each_child
Dir.foreach('/path/to/dir') do |filename| next if filename == '.' or filename == '..' # Do work on the remaining files & directories end
Dir::foreach和Dir::entries(以及Dir::each_child和Dir::children)也包含隐藏文件&目录。通常这就是你想要的,但如果不是,你需要做一些事情来跳过它们。
Dir::children
或者,你可能想看看Dir::glob,它提供了简单的通配符匹配:
Dir::glob
Dir.glob('/path/to/dir/*.rb') do |rb_filename| # Do work on files & directories ending in .rb end
require 'find' Find.find(path) do |file| # process end
这是一个标准的ruby库,所以应该是可用的
这是我最喜欢的易于阅读的方法:
Dir.glob("*/*.txt") do |my_text_file| puts "working on: #{my_text_file}..." end
你甚至可以将它扩展到subdirs中的所有文件:
Dir.glob("**/*.txt") do |my_text_file| # note one extra "*" puts "working on: #{my_text_file}..." end
Dir也有更短的语法,从目录中获取所有文件的数组:
Dir['dir/to/files/*'].each do |fname| # do something with fname end
我喜欢上面没有提到的这个。
require 'pathname' Pathname.new('/my/dir').children.each do |path| puts path end
这样做的好处是,您得到的是一个Pathname对象,而不是一个字符串,您可以用它做一些有用的事情,并进一步遍历。
跳过. &..,你可以使用Dir::each_child。
Dir.each_child('/path/to/dir') do |filename| puts filename end
Dir::children返回文件名数组。