我想使用Ruby从一个文件夹中获得所有文件名。
当前回答
这是一个在目录中查找文件的解决方案:
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.new('/home/user/foldername').each { |file| puts file }
在IRB上下文中,您可以使用以下命令获取当前目录中的文件:
file_names = `ls`.split("\n")
你也可以在其他目录上这样做:
file_names = `ls ~/Documents`.split("\n")
下面的代码片段精确地显示了目录内的文件名称,跳过子目录和“。”,“..”带点的文件夹:
Dir.entries("your/folder").select { |f| File.file? File.join("your/folder", f) }
你可能还想使用Rake::FileList(如果你有Rake依赖):
FileList.new('lib/*') do |file|
p file
end
根据API:
filelist是懒惰的。当给出可能的glob模式列表时 要包含在文件列表中的文件,而不是搜索文件 结构来查找文件,FileList保存后者的模式 使用。
https://docs.ruby-lang.org/en/2.1.0/Rake/FileList.html
除了这篇文章中的建议,我想提到的是,如果你也需要返回点文件(。gitignore等),与Dir。Glob你需要包括一个标志,如下所示: Dir。一团(“/道路/ / dir / *”,文件::FNM_DOTMATCH) 默认为Dir。条目包括点文件,以及当前的父目录。
对于感兴趣的人,我很好奇这里的答案在执行时间上是如何比较的,下面是针对深度嵌套层次结构的结果。前三个结果是非递归的:
user system total real
Dir[*]: (34900 files stepped over 100 iterations)
0.110729 0.139060 0.249789 ( 0.249961)
Dir.glob(*): (34900 files stepped over 100 iterations)
0.112104 0.142498 0.254602 ( 0.254902)
Dir.entries(): (35600 files stepped over 100 iterations)
0.142441 0.149306 0.291747 ( 0.291998)
Dir[**/*]: (2211600 files stepped over 100 iterations)
9.399860 15.802976 25.202836 ( 25.250166)
Dir.glob(**/*): (2211600 files stepped over 100 iterations)
9.335318 15.657782 24.993100 ( 25.006243)
Dir.entries() recursive walk: (2705500 files stepped over 100 iterations)
14.653018 18.602017 33.255035 ( 33.268056)
Dir.glob(**/*, File::FNM_DOTMATCH): (2705500 files stepped over 100 iterations)
12.178823 19.577409 31.756232 ( 31.767093)
它们是由以下基准测试脚本生成的:
require 'benchmark'
base_dir = "/path/to/dir/"
n = 100
Benchmark.bm do |x|
x.report("Dir[*]:") do
i = 0
n.times do
i = i + Dir["#{base_dir}*"].select {|f| !File.directory? f}.length
end
puts " (#{i} files stepped over #{n} iterations)"
end
x.report("Dir.glob(*):") do
i = 0
n.times do
i = i + Dir.glob("#{base_dir}/*").select {|f| !File.directory? f}.length
end
puts " (#{i} files stepped over #{n} iterations)"
end
x.report("Dir.entries():") do
i = 0
n.times do
i = i + Dir.entries(base_dir).select {|f| !File.directory? File.join(base_dir, f)}.length
end
puts " (#{i} files stepped over #{n} iterations)"
end
x.report("Dir[**/*]:") do
i = 0
n.times do
i = i + Dir["#{base_dir}**/*"].select {|f| !File.directory? f}.length
end
puts " (#{i} files stepped over #{n} iterations)"
end
x.report("Dir.glob(**/*):") do
i = 0
n.times do
i = i + Dir.glob("#{base_dir}**/*").select {|f| !File.directory? f}.length
end
puts " (#{i} files stepped over #{n} iterations)"
end
x.report("Dir.entries() recursive walk:") do
i = 0
n.times do
def walk_dir(dir, result)
Dir.entries(dir).each do |file|
next if file == ".." || file == "."
path = File.join(dir, file)
if Dir.exist?(path)
walk_dir(path, result)
else
result << file
end
end
end
result = Array.new
walk_dir(base_dir, result)
i = i + result.length
end
puts " (#{i} files stepped over #{n} iterations)"
end
x.report("Dir.glob(**/*, File::FNM_DOTMATCH):") do
i = 0
n.times do
i = i + Dir.glob("#{base_dir}**/*", File::FNM_DOTMATCH).select {|f| !File.directory? f}.length
end
puts " (#{i} files stepped over #{n} iterations)"
end
end
文件计数的差异是由于Dir。默认情况下包含隐藏文件的条目。Dir。在这种情况下,由于需要重新构建文件的绝对路径以确定文件是否为目录,条目最终花费的时间要长一些,但即使没有这一点,在递归情况下,它仍然比其他选项花费的时间要长。这都是在OSX上使用ruby 2.5.1完成的。
推荐文章
- 如何可靠地打开与当前运行脚本在同一目录下的文件
- 在c#中从URI字符串获取文件名
- 如何找到包含匹配值的哈希键
- 如何在Rails中找到当前的路由?
- 将列表的Python列表写入csv文件
- 在Ruby中->运算符叫什么?
- Rails参数解释?
- Ruby中DateTime和Time的区别
- 如何从代理服务器后面更新Ruby Gems (ISA-NTLM)
- 如何用另一个键替换哈希键
- 如何使用Bash创建一个文件夹,如果它还不存在?
- attr_accessor和attr_accessible的区别
- 如何从Ruby文件路径中获得没有扩展名的文件名
- rvm安装失败:“rvm不是一个函数”
- 学习Ruby on Rails