Find 모듈
Find 모듈 (Find)
Find 모듈은 일련의 파일 경로들을 위에서 아래로(top-down) 순회하는 기능을 지원해요. 예를 들어 홈 디렉토리 아래 모든 파일의 크기를 합산하되, .ssh처럼 "점(dot)" 디렉토리에 있는 것은 무시하는 코드를 볼게요.
require 'find'
total_size = 0
Find.find(ENV["HOME"]) do |path|
if FileTest.directory?(path)
if File.basename(path).start_with?('.')
Find.prune # Don't look any further into this directory.
else
next
end
else
total_size += FileTest.size(path)
end
end
디렉토리를 만나면 이름이 .로 시작하는지 확인해서, 그렇다면 Find.prune으로 그 디렉토리 안으로 더 들어가지 않게 막아요. 그게 아니면 next로 그 디렉토리 자체는 크기 합산에서 건너뛰고, 파일이면 크기를 더해주는 흐름이에요.
출처: Ruby 4.0 API
본문
::find (Public Class Method)
find(*paths, ignore_error: true) { |path| ... } — 인자로 주어진 모든 파일과 디렉토리의 이름으로 연관된 블록을 호출하고, 그 다음에는 그 하위 디렉토리들에 재귀적으로 호출하는 식으로 쭉 내려가요. 블록이 없으면 열거자(enumerator)를 돌려줘요.
ignore_error: true가 기본이라 경로를 읽는 도중 일부 오류(Errno::ENOENT, Errno::EACCES 등)가 나도 조용히 다음 항목으로 넘어가요. false로 바꾸면 그런 오류가 그대로 올라옵니다.
::prune (Public Class Method)
prune — 현재 파일이나 디렉토리를 건너뛰고, 루프를 다음 항목으로 다시 시작해요. 현재 파일이 디렉토리라면 그 디렉토리를 재귀적으로 들어가지 않아요. Find::find와 연관된 블록 안에서만 의미가 있어요.