单行以递归方式列出Ruby中的目录?

Lan*_*ard 94 ruby filesystems recursion

在Ruby中获取目录数组(不包括文件)的最快,最优化,单行方式是什么?

包含文件怎么样?

sep*_*p2k 172

Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
Run Code Online (Sandbox Code Playgroud)

而不是Dir.glob(foo)你也可以写Dir[foo](但Dir.glob也可以采取一个块,在这种情况下,它将产生每个路径,而不是创建一个数组).

Ruby Glob Docs

  • 使用`Dir.glob("**/")`除非你也想要符号链接 (10认同)
  • 隐藏文件和目录怎么样? (6认同)
  • 要在匹配结果中包含dotfiles,请使用`File :: FNM_DOTMATCH`标志. (6认同)
  • 谢谢@ x-yuri!标志btw如下所示:`Dir.glob("**/*",File :: FNM_DOTMATCH)` (2认同)
  • 这是文档:http://www.ruby-doc.org/core-2.2.0/Dir.html#method-c-glob (2认同)

Fel*_*peC 53

我相信这里的解决方案都不涉及隐藏目录(例如'.test'):

require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Run Code Online (Sandbox Code Playgroud)


MBO*_*MBO 29

对于目录列表,请尝试

Dir['**/']
Run Code Online (Sandbox Code Playgroud)

文件列表更难,因为在Unix目录中也是一个文件,因此您需要测试类型或从返回列表中删除条目,该条目是其他条目的父级.

Dir['**/*'].reject {|fn| File.directory?(fn) }
Run Code Online (Sandbox Code Playgroud)

并简单地列出所有文件和目录

Dir['**/*']
Run Code Online (Sandbox Code Playgroud)

  • @sepp2k 是的,我在玩 irb 时错过了这部分。但我把它留在这里以防有人可能会搜索类似的东西:-) (3认同)

joh*_*nes 7

快速一个班轮

只有目录

`find -type d`.split("\n")
Run Code Online (Sandbox Code Playgroud)

目录和普通文件

`find -type d -or -type f`.split("\n")`
Run Code Online (Sandbox Code Playgroud)

纯净美丽的红宝石

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)
Run Code Online (Sandbox Code Playgroud)


tro*_*skn 7

如此处的其他答案所述,您可以使用Dir.glob.请记住,文件夹中可能包含许多奇怪的字符,而glob参数是模式,因此某些字符具有特殊含义.因此,执行以下操作是不安全的:

Dir.glob("#{folder}/**/*")
Run Code Online (Sandbox Code Playgroud)

相反:

Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
Run Code Online (Sandbox Code Playgroud)