遍历一个目录中的每个文件

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

我是ruby的新手,我已经得出结论,这样做的方式是一个做每个循环 ruby文件将从与我想要循环的目录不同的目录执行

我已经尝试了Dir.foreach,我不能让它工作。

175467 次浏览
Dir.foreach("/home/mydir") do |fname|
puts fname
end
Dir.new('/my/dir').each do |name|
...
end

正如其他人所说,Dir::foreach在这里是一个很好的选择。然而,请注意Dir::foreachDir::entries将始终包含...(当前和父目录)。你通常不想处理它们,所以你可以使用Dir::each_childDir::foreach0(作为Dir::foreach1)或这样做:

Dir.foreach('/path/to/dir') do |filename|
next if filename == '.' or filename == '..'
# Do work on the remaining files & directories
end

Dir::foreachDir::entries(以及Dir::each_childDir::children)也包含隐藏文件&目录。通常这就是你想要的,但如果不是,你需要做一些事情来跳过它们。

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

Dir.glob('/path/to/dir/*.rb') do |rb_filename|
# Do work on files & directories ending in .rb
end
find库是专门为这个任务设计的: https://ruby-doc.org/stdlib-2.5.1/libdoc/find/rdoc/Find.html < / p >
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返回文件名数组。