Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby에서 디렉토리 다루는 방법 – Dir 클래스 완벽 가이드

Ruby만으로 파일 시스템을 자유롭게 탐색할 수 있다는 사실을 알고 계셨나요?

핵심은 바로 Ruby의 Dir 클래스입니다.

디렉토리 항목을 나열하고, 현재 작업 디렉토리를 변경하고, 새 폴더를 생성하는 것까지 모두 가능합니다!

간단한 예제부터 살펴보겠습니다:

filenames = Dir.entries(".")

entries 메서드는 파일명 항목들의 배열을 반환합니다. 모든 항목은 문자열이므로, 실제 파일 내용을 읽으려면 Ruby의 File 클래스와 함께 사용해야 합니다.

참고로 위 코드의 점(.)은 현재 디렉토리를 의미합니다.

여기서 중요한 점은, 이 현재 디렉토리란 코드가 실행되는 위치이지 터미널에서 여러분이 머무르고 있는 디렉토리가 아니라는 것입니다.

그렇기 때문에...

Dir.pwd 메서드를 사용해 현재 작업 디렉토리가 어디인지 확인해 보는 습관이 도움이 됩니다.

자, 이제 Dir 클래스를 활용해 새 디렉토리를 만들고(mkdir), 이름을 변경하고(mv), 특정 패턴에 맞는 파일명을 찾는 방법(glob)을 하나씩 배워보겠습니다.

Dir.mkdir 메서드로 새 디렉토리 생성하기

Ruby로 새 폴더를 만들려면 Dir.mkdir 메서드를 사용하면 됩니다.

예제:

Dir.mkdir("testing")

상대 경로를 지정하면 해당 디렉토리는 현재 경로(Dir.pwd) 아래에 생성됩니다.

다음과 같은 에러가 발생할 수 있습니다:

  • 디렉토리가 이미 존재하는 경우 (Errno::EEXIST)
  • 권한이 없는 경우 (Errno::EACCES)
  • 아직 존재하지 않는 상위 폴더 아래에 폴더를 만들려는 경우 (Errno::ENOENT)

마지막 에러는 주로 중첩된 디렉토리를 한 번에 만들려고 할 때 발생합니다.

또는 존재하지 않는 절대 경로를 사용했을 때도 나타납니다.

두 가지 해결 방법:

  • 디렉토리를 생성하기 전에 Dir.exists?로 존재 여부를 먼저 확인하기
  • 더 강력한 기능을 제공하는 클래스 사용하기 (다음 섹션)

계속해서 더 알아보겠습니다!

FileUtils 모듈로 고급 작업 처리하기

좀 더 강력한 기능이 필요하다면 표준 라이브러리의 FileUtils 모듈을 불러와 사용할 수 있습니다.

이 모듈에는 mkdir_p처럼 중첩된 디렉토리를 한 번에 생성해 주는 메서드들이 포함되어 있습니다.

예제:

require 'fileutils'

FileUtils.mkdir_p("/tmp/testing/a/b")

꽤 유용하죠?

여기서 끝이 아닙니다. FileUtils는 모든 파일 연산에 키워드 인수 형태의 추가 옵션도 제공합니다. 실행되는 리눅스 명령어를 출력해 주는 verbose 옵션과 실제로 파일을 변경하지 않는 noop 옵션이 대표적입니다.

직접 사용해 보세요!

디렉토리 이름 변경하기

Ruby는 운영체제 UI나 터미널에서 할 수 있는 거의 모든 작업을 코드로 수행할 수 있게 해줍니다.

예를 들어...

디렉토리 이름은 이렇게 변경합니다:

FileUtils.mv("/tmp/a", "/tmp/b")

mv 메서드는 Dir 클래스에는 없고 FileUtils에만 포함되어 있으므로, 반드시 FileUtils를 사용해야 합니다.

현재 디렉토리 변경하기

모든 디렉토리 연산은 현재 디렉토리를 기준으로 실행되기 때문에, 필요에 따라 작업 디렉토리를 변경하고 싶을 수 있습니다.

이럴 때 Dir.chdir 메서드를 사용합니다.

예제:

Dir.chdir("/tmp") { Dir.entries(".") }

이 메서드는 두 가지 방식으로 동작합니다:

  • 블록과 함께 사용하면, 블록 내부의 코드에만 디렉토리 변경이 적용됩니다
  • 블록 없이 사용하면, 메서드 호출 이후의 모든 코드에 변경이 적용됩니다

주의할 점은 chdir는 오직 Ruby 프로세스 내부에서만 동작한다는 것입니다. 외부 환경에는 영향을 주지 않습니다.

다시 말해...

Ruby 프로그램이 종료된 후에는 셸(shell)의 작업 디렉토리가 변경되지 않습니다.

패턴 매칭으로 파일 및 디렉토리 목록 조회하기

특정 폴더 안의 모든 Ruby 파일을 찾고 싶으신가요? glob 메서드를 사용하면 아주 간단합니다!

예제:

Dir.glob("*.rb")

확장자는 ".txt", ".yml" 등 원하는 어떤 것이든 지정할 수 있습니다. 파일명의 일부인 다른 문자열도 물론 가능합니다.

모든 하위 폴더까지 포함해서 파일을 찾고 싶다면요?

네, 그것도 가능합니다:

Dir.glob("**/*.rb")

결과는 상대 경로를 포함한 전체 파일명 배열로 반환됩니다. glob으로 얻은 목록의 각 파일에 File.basename 메서드를 적용하면 경로를 제거하고 파일명만 추출할 수 있습니다.

마무리

이번 글에서는 Dir 클래스와 FileUtils 모듈을 활용해 Ruby에서 디렉토리를 다루는 방법을 배웠습니다.

이제 직접 실습하면서 익혀볼 차례입니다.

읽어주셔서 감사합니다! 🙂