在文件夹及其所有子文件夹中search某种types的文件

我正在尝试在给定的文件夹中search给定types的所有文件(比如.pdf),并将它们复制到一个新的文件夹中。 我需要能够做的是指定一个根文件夹,并search该文件夹及其所有子文件夹,以查找与给定types(.pdf)相匹配的任何文件。 任何人都可以给我一个关于如何通过根文件夹的子文件夹和他们的子文件夹等进行search的手。 这听起来像一个recursion的方法会在这里做的伎俩,但我不能正确实施一个? (顺便说一句,我正在用ruby实现这个程序)。

你想要查找模块。 Find.find需要一个包含path的string,并将父path和每个文件和子目录的path一起传递给相应的块。 一些示例代码:

 require 'find' pdf_file_paths = [] Find.find('path/to/search') do |path| pdf_file_paths << path if path =~ /.*\.pdf$/ end 

这将recursionsearchpath,并将所有以.pdf结尾的文件名存储在一个数组中。

尝试这个:

 Dir.glob("#{folder}/**/*.pdf") 

这是一样的

 Dir["#{folder}/**/*.pdf"] 

其中文件夹variables是您要search的根文件夹的path。

如果速度是一个问题,比Find.find更喜欢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]

作为Jergason和Matt在上面的答案的一个小改进,下面是你可以如何凝聚成一条线:

 pdf_file_paths = Find.find('path/to/search').select { |p| /.*\.pdf$/ =~ p } 

这使用上面的Find方法,但是利用了结果是一个可枚举的事实(因此我们可以使用select)来获得一组数组