我想使用Ruby从一个文件夹中获得所有文件名。
当前回答
要递归地获取所有文件(严格来说只针对文件):
Dir.glob('path/**/*').select { |e| File.file? e }
或者任何不是目录的东西(File.file?将拒绝非常规文件):
Dir.glob('path/**/*').reject { |e| File.directory? e }
可选择的解决方案
在Dir等基于模式的查找方法上使用Find# Find。Glob实际上更好。请参阅“用Ruby递归列出目录的一行程序?”
其他回答
要递归地获取所有文件(严格来说只针对文件):
Dir.glob('path/**/*').select { |e| File.file? e }
或者任何不是目录的东西(File.file?将拒绝非常规文件):
Dir.glob('path/**/*').reject { |e| File.directory? e }
可选择的解决方案
在Dir等基于模式的查找方法上使用Find# Find。Glob实际上更好。请参阅“用Ruby递归列出目录的一行程序?”
下面的代码片段精确地显示了目录内的文件名称,跳过子目录和“。”,“..”带点的文件夹:
Dir.entries("your/folder").select { |f| File.file? File.join("your/folder", f) }
在IRB上下文中,您可以使用以下命令获取当前目录中的文件:
file_names = `ls`.split("\n")
你也可以在其他目录上这样做:
file_names = `ls ~/Documents`.split("\n")
如果您想获得包含符号链接的文件名数组,请使用
Dir.new('/path/to/dir').entries.reject { |f| File.directory? f }
甚至
Dir.new('/path/to/dir').reject { |f| File.directory? f }
如果你不想使用符号链接,请使用
Dir.new('/path/to/dir').select { |f| File.file? f }
如其他答案所示,如果你想递归地获得所有文件,使用dir .glob('/path/to/dir/**/*')而不是dir .new('/path/to/dir')。
在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
推荐文章
- 数组到哈希Ruby
- 使用Java重命名文件
- 我如何让红宝石打印一个完整的回溯而不是截断一个?
- 如何从Python包内读取(静态)文件?
- 如何使用RSpec的should_raise与任何类型的异常?
- 如何创建退出消息
- 忽略GEM,因为没有构建它的扩展
- 为什么我得到“Pickle - EOFError: run out of input”读取一个空文件?
- 在Gem::Specification.reset期间未解决的规格:
- Delete_all vs destroy_all
- 双引号vs单引号
- 用any可以吗?'来检查数组是否为空?
- Rails获取“each”循环的索引
- c#测试用户是否有对文件夹的写权限
- 写字符串到文本文件,并确保它总是覆盖现有的内容。