One-liner to recursively list directories in Ruby?

2019-01-10 01:33发布

What is the fastest, most optimized, one-liner way to get an array of the directories (excluding files) in Ruby?

How about including files?

9条回答
ら.Afraid
2楼-- · 2019-01-10 02:05

For list of directories try

Dir['**/']

List of files is harder, because in Unix directory is also a file, so you need to test for type or remove entries from returned list which is parent of other entries.

Dir['**/*'].reject {|fn| File.directory?(fn) }

And for list of all files and directories simply

Dir['**/*']
查看更多
贪生不怕死
3楼-- · 2019-01-10 02:05

Fast one liner

Only directories

`find -type d`.split("\n")

Directories and normal files

`find -type d -or -type f`.split("\n")`

Pure beautiful ruby

require "pathname"

def rec_path(path, file= false)
  puts path
  path.children.collect do |child|
    if file and child.file?
      child
    elsif child.directory?
      rec_path(child, file) + [child]
    end
  end.select { |x| x }.flatten(1)
end

# only directories
rec_path(Pathname.new(dir), false)
# directories and normal files
rec_path(Pathname.new(dir), true)
查看更多
该账号已被封号
4楼-- · 2019-01-10 02:06

Here's an example that combines dynamic discovery of a Rails project directory with Dir.glob:

dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
查看更多
叛逆
5楼-- · 2019-01-10 02:08

I believe none of the solutions here deal with hidden directories (e.g. '.test'):

require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
查看更多
【Aperson】
6楼-- · 2019-01-10 02:11

As noted in other answers here, you can use Dir.glob. Keep in mind that folders can have lots of strange characters in them, and glob arguments are patterns, so some characters have special meanings. As such, it's unsafe to do something like the following:

Dir.glob("#{folder}/**/*")

Instead do:

Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
查看更多
相关推荐>>
7楼-- · 2019-01-10 02:14
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files

Instead of Dir.glob(foo) you can also write Dir[foo] (however Dir.glob can also take a block, in which case it will yield each path instead of creating an array).

Ruby Glob Docs

查看更多
登录 后发表回答