我正在尝试在给定文件夹中搜索给定类型的所有文件,并将它们复制到新文件夹中。
我需要指定一个根文件夹,并在该文件夹及其所有子文件夹中搜索与给定类型匹配的所有文件。
如何搜索根文件夹的子文件夹及其子文件夹?似乎可以使用递归方法,但是我无法正确实现一个方法。
我正在尝试在给定文件夹中搜索给定类型的所有文件,并将它们复制到新文件夹中。
我需要指定一个根文件夹,并在该文件夹及其所有子文件夹中搜索与给定类型匹配的所有文件。
如何搜索根文件夹的子文件夹及其子文件夹?似乎可以使用递归方法,但是我无法正确实现一个方法。
Answers:
尝试这个:
Dir.glob("#{folder}/**/*.pdf")
这与
Dir["#{folder}/**/*.pdf"]
文件夹变量是您要搜索的根文件夹的路径。
Dir.glob("#{folder}/**/*.pdf")
,其中folder
变量是您要搜索的根文件夹的路径。
Dir#[]
就是我通常使用的。但是,有一个陷阱:Dir.glob
将所有路径都加载到内存中。通常这很好,但是如果您有很多路径,则可能更喜欢使用Find模块,因为它会在找到路径时将路径传递给块。
如果速度是一个问题,更喜欢Dir.glob
了Find.find
。
Warming up --------------------------------------
Find.find 124.000 i/100ms
Dir.glob 515.000 i/100ms
Calculating -------------------------------------
Find.find 1.242k (± 4.7%) i/s - 6.200k in 5.001398s
Dir.glob 5.249k (± 4.5%) i/s - 26.265k in 5.014632s
Comparison:
Dir.glob: 5248.5 i/s
Find.find: 1242.4 i/s - 4.22x slower
require 'find'
require 'benchmark/ips'
dir = '.'
Benchmark.ips do |x|
x.report 'Find.find' do
Find.find(dir).select { |f| f =~ /\*\.pdf/ }
end
x.report 'Dir.glob' do
Dir.glob("#{dir}/**/*\.pdf")
end
x.compare!
end
使用 ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin15]
Dir.glob
vs中应该使用哪种方法非常有帮助Find.find
。
#end_with?
用来比较它们之间的关系
false
但它仍然会显着变慢(尝试一下)。这是因为调用块也需要一些时间,并且对于找到的每个项目都会发生,而glob
内部过滤器只有在完成收集结果后才会返回。因此,与之配合使用的过滤器find
可能非常复杂,可能是包含查找和多个正则表达式的100行代码,而glob
每个调用只了解一种简单的模式。如果您可以通过这种方式表示搜索,请选择glob
。
另一种快速的方法是将任务委托给shell命令“ find”并分割输出:
pdf_file_paths = `find #{dir} -name "*.pdf"`.split("\n")
在Windows上不起作用。