我正在尝试在给定文件夹中搜索给定类型的所有文件(例如.pdf)并将它们复制到新文件夹。我需要做的是指定一个根文件夹,并在该文件夹及其所有子文件夹中搜索与给定类型(.pdf)匹配的任何文件。任何人都可以告诉我如何搜索根文件夹的子文件夹及其子文件夹等。这听起来像一个递归方法可以解决这个问题,但我无法正确实现一个? (顺便说一下,我正在ruby中实现这个程序。)
答案 0 :(得分:101)
试试这个:
Dir.glob("#{folder}/**/*.pdf")
与
相同Dir["#{folder}/**/*.pdf"]
文件夹变量是您要搜索的根文件夹的路径。
答案 1 :(得分:60)
您需要Find模块。 Find.find
接受包含路径的字符串,并将父路径以及每个文件和子目录的路径传递给随附的块。一些示例代码:
require 'find'
pdf_file_paths = []
Find.find('path/to/search') do |path|
pdf_file_paths << path if path =~ /.*\.pdf$/
end
这将以递归方式搜索路径,并将以.pdf结尾的所有文件名存储在数组中。
答案 2 :(得分:20)
如果需要考虑速度,请选择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]
答案 3 :(得分:11)
作为Jergason和Matt上面的答案的一个小改进,这里有你如何凝聚成一行:
pdf_file_paths = Find.find('path/to/search').select { |p| /.*\.pdf$/ =~ p }
这使用了上面的Find方法,但利用了结果是可枚举的事实(因此我们可以使用select)来获取带有匹配集的数组
答案 4 :(得分:0)
另一种快速的方法是将任务委托给shell命令“ find”并分割输出:
pdf_file_paths = `find #{dir} -name "*.pdf"`.split("\n")
在Windows上不起作用。