반응형
특정 유형의 파일에 대한 폴더 및 모든 하위 폴더 검색
주어진 폴더에서 주어진 유형 (예 : .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를 사용할 수 있음) 일치 집합이있는 배열을 다시 가져옵니다.
반응형
'program story' 카테고리의 다른 글
C #의 Zip 폴더 (0) | 2020.11.16 |
---|---|
다음 월요일, 화요일 등의 날짜 가져 오기 (0) | 2020.11.16 |
권한 파일이 프로비저닝 프로필에 지정된 것과 일치하지 않습니다. (0xE8008016) (0) | 2020.11.16 |
포인터가 가리키는 int의 증가 값 (0) | 2020.11.15 |
CSS 공급 업체 접두사 목록? (0) | 2020.11.15 |