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와 연관된 블록 안에서만 의미가 있어요.