我想使用Ruby从一个文件夹中获得所有文件名。
当前回答
要递归地获取所有文件(严格来说只针对文件):
Dir.glob('path/**/*').select { |e| File.file? e }
或者任何不是目录的东西(File.file?将拒绝非常规文件):
Dir.glob('path/**/*').reject { |e| File.directory? e }
可选择的解决方案
在Dir等基于模式的查找方法上使用Find# Find。Glob实际上更好。请参阅“用Ruby递归列出目录的一行程序?”
其他回答
在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.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')。
在获取目录中的所有文件名时,此代码段可用于拒绝两个目录[。, . .]和以a开头的隐藏文件。
files = Dir.entries("your/folder").reject {|f| File.directory?(f) || f[0].include?('.')}
在IRB上下文中,您可以使用以下命令获取当前目录中的文件:
file_names = `ls`.split("\n")
你也可以在其他目录上这样做:
file_names = `ls ~/Documents`.split("\n")
def get_path_content(dir)
queue = Queue.new
result = []
queue << dir
until queue.empty?
current = queue.pop
Dir.entries(current).each { |file|
full_name = File.join(current, file)
if not (File.directory? full_name)
result << full_name
elsif file != '.' and file != '..'
queue << full_name
end
}
end
result
end
返回文件在目录和所有子目录中的相对路径
推荐文章
- 是否可以在MiniTest中运行单个测试?
- 如何在Ruby中生成a和b之间的随机数?
- 如何在Python中获得所有直接子目录
- 即使模板文件存在,Flask也会引发TemplateNotFound错误
- 无法安装gem -未能建立gem本地扩展-无法加载这样的文件——mkmf (LoadError)
- 如何复制在bash所有目录和文件递归?
- 如何在Ruby中创建文件
- 什么是Ruby文件。开放模式和选项?
- Ruby数组到字符串的转换
- 如何分割(块)一个Ruby数组成X元素的部分?
- Ruby中“or”和||的区别?
- __FILE__宏显示完整路径
- 如何测试参数是否存在在轨道
- 文件名中允许的字符
- 在Ruby中不创建新字符串而修饰字符串的规范方法是什么?