在文件夹及其所有子文件夹中搜索特定类型的文件

时间:2010-08-17 00:48:04

标签: ruby file-io recursion

我正在尝试在给定文件夹中搜索给定类型的所有文件(例如.pdf)并将它们复制到新文件夹。我需要做的是指定一个根文件夹,并在该文件夹及其所有子文件夹中搜索与给定类型(.pdf)匹配的任何文件。任何人都可以告诉我如何搜索根文件夹的子文件夹及其子文件夹等。这听起来像一个递归方法可以解决这个问题,但我无法正确实现一个? (顺便说一下,我正在ruby中实现这个程序。)

5 个答案:

答案 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上不起作用。