2010-08-17 107 views
56

我正试图在给定文件夹中搜索给定类型(例如.pdf)的所有文件,并将它们复制到新文件夹中。我需要做的是指定一个根文件夹,并搜索该文件夹及其所有子文件夹中的任何与给定类型(.pdf)相匹配的文件。任何人都可以给我一个关于如何搜索根文件夹的子文件夹及其子文件夹等的手。这听起来像一个递归的方法会在这里做的伎俩,但我不能正确实施一个? (顺便说一句,我正在用ruby实现这个程序)。在某个文件夹及其所有子文件夹中搜索特定类型的文件

回答

54

您需要Find模块。 Find.find需要一个包含路径的字符串,并将父路径以及每个文件和子目录的路径传递给一个伴随块。一些示例代码:

require 'find' 

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

这将递归搜索的路径,并存储在数组中以.pdf结尾的文件名。

79

试试这个:

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

这是一样的

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

当文件夹变量是路径要通过搜索的根文件夹。

+0

方法是正确的,但执行是错误的。它需要是Dir.glob('**/*。pdf') – jergason 2010-08-17 17:40:25

+2

我认为OP想要递归,不是吗? – rogerdpack 2012-07-19 19:43:55

+0

最初的回答(rogerdpack)为我工作,但Jergason's没有,我害怕。 – Joyce 2013-03-07 23:00:11

9

作为一个小的改进上面Jergason和马特的答案,这里是你如何能凝结成单行:

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

它使用查找方法同上,但利用的事实,结果是一个枚举(并且因此我们可以使用select)来获得与该组匹配的阵列

16

如果速度是问题,则优选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]

+2

谢谢你的帖子。对于像我这样的初学者来说,找出在Dir.glob和Find.find之间应该使用哪种方法是非常有用的。 – itsh 2016-09-14 18:15:19

+2

在这种情况下查找速度应该比较慢,因为您使用的是正则表达式。另一方面,Dir.glob并不像正则表达式那样强大,所以我期望它更快。 – hirowatari 2017-08-18 20:39:51

相关问题