我想使用Ruby从一个文件夹中获得所有文件名。


当前回答

这是对我有效的方法:

Dir.entries(dir).select { |f| File.file?(File.join(dir, f)) }

Dir。Entries返回一个字符串数组。然后,我们必须提供文件的完整路径file .file?,除非dir等于我们当前的工作目录。这就是File.join()的原因。

其他回答

在获取目录中的所有文件名时,此代码段可用于拒绝两个目录[。, . .]和以a开头的隐藏文件。

files = Dir.entries("your/folder").reject {|f| File.directory?(f) || f[0].include?('.')}

这是一个在目录中查找文件的解决方案:

files = Dir["/work/myfolder/**/*.txt"]

files.each do |file_name|
  if !File.directory? file_name
    puts file_name
    File.open(file_name) do |file|
      file.each_line do |line|
        if line =~ /banco1/
          puts "Found: #{line}"
        end
      end
    end
  end
end

就我个人而言,我发现这对于在文件夹中循环文件最有用,前瞻性安全:

Dir['/etc/path/*'].each do |file_name|
  next if File.directory? file_name 
end

在Ruby 2.5中,你现在可以使用Dir.children。它以数组的形式获取文件名,除了"."和".."

例子:

Dir.children("testdir")   #=> ["config.h", "main.rb"]

http://ruby-doc.org/core-2.5.0/Dir.html#method-c-children

要递归地获取所有文件(严格来说只针对文件):

Dir.glob('path/**/*').select { |e| File.file? e }

或者任何不是目录的东西(File.file?将拒绝非常规文件):

Dir.glob('path/**/*').reject { |e| File.directory? e }

可选择的解决方案

在Dir等基于模式的查找方法上使用Find# Find。Glob实际上更好。请参阅“用Ruby递归列出目录的一行程序?”