How to search a folder and all of its subfolders for files of a certain type

前端 未结 5 702
無奈伤痛
無奈伤痛 2020-11-29 22:19

I am trying to search for all files of a given type in a given folder and copy them to a new folder.

I need to specify a root folder and search through that folder a

相关标签:
5条回答
  • 2020-11-29 22:22

    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.

    0 讨论(0)
  • 2020-11-29 22:29

    As a small improvement to Jergason and Matt's answer above, here's how you can condense to a single line:

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

    This uses the Find method as above, but leverages the fact that the result is an enumerable (and as such we can use select) to get an array back with the set of matches

    0 讨论(0)
  • 2020-11-29 22:31

    Try this:

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

    which is the same as

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

    Where the folder variable is the path to the root folder you want to search through.

    0 讨论(0)
  • 2020-11-29 22:46

    If speed is a concern, prefer Dir.glob over 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
    

    Using ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin15]

    0 讨论(0)
  • 2020-11-29 22:46

    Another fast way of doing this is delegating the task to the shell command "find" and splitting the output:

    pdf_file_paths = `find #{dir} -name "*.pdf"`.split("\n")
    

    Does not work on Windows.

    0 讨论(0)
提交回复
热议问题