How to search a folder and all of its subfolders for files of a certain type
You want the Find module. Find.find
takes a string containing a path, and will pass the parent path along with the path of each file and sub-directory to an accompanying block. Some example code:
require 'find'pdf_file_paths = []Find.find('path/to/search') do |path| pdf_file_paths << path if path =~ /.*\.pdf$/end
That will recursively search a path, and store all file names ending in .pdf in an array.
If speed is a concern, prefer Dir.glob
over Find.find
.
Warming up -------------------------------------- Find.find 124.000 i/100ms Dir.glob 515.000 i/100msCalculating ------------------------------------- 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.014632sComparison: 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
Using ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin15]