program story

특정 유형의 파일에 대한 폴더 및 모든 하위 폴더 검색

inputbox 2020. 11. 16. 08:14
반응형

특정 유형의 파일에 대한 폴더 및 모든 하위 폴더 검색


주어진 폴더에서 주어진 유형 (예 : .pdf)의 모든 파일을 검색하여 새 폴더에 복사하려고합니다. 내가 할 수 있어야 할 일은 루트 폴더를 지정하고 해당 폴더와 모든 하위 폴더에서 주어진 유형 (.pdf)과 일치하는 파일을 검색하는 것입니다. 누구든지 루트 폴더의 하위 폴더와 하위 폴더 등을 검색하는 방법을 알려줄 수 있습니까? 재귀 메서드가 여기에서 트릭을 수행하는 것처럼 들리지만 올바르게 구현할 수 없습니까? (나는이 프로그램을 루비로 구현하고있다).


당신이 원하는 찾기 모듈을. Find.find경로가 포함 된 문자열을 취하고 각 파일 및 하위 디렉토리의 경로와 함께 부모 경로를 동반 블록으로 전달합니다. 몇 가지 예제 코드 :

require 'find'

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

그러면 경로를 재귀 적으로 검색하고 .pdf로 끝나는 모든 파일 이름을 배열에 저장합니다.


이 시도:

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

이것은

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

여기서 폴더 변수는 검색 할 루트 폴더의 경로입니다.


속도가 문제가있는 경우, 선호 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]


위의 Jergason 및 Matt의 답변에 대한 작은 개선 사항으로 다음과 같이 한 줄로 요약 할 수 있습니다.

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

이것은 위와 같이 Find 메서드를 사용하지만 결과가 열거 가능하다는 사실을 활용하여 (그러므로 select를 사용할 수 있음) 일치 집합이있는 배열을 다시 가져옵니다.

참고 URL : https://stackoverflow.com/questions/3498539/searching-a-folder-and-all-of-its-subfolders-for-files-of-a-certain-type

반응형