Ruby에서 재귀 적으로 디렉토리를 만드는 방법은 무엇입니까?


101

파일을 /a/b/c/d.txt로 저장하고 싶지만 이러한 디렉토리가 존재하는지 여부를 모르고 필요한 경우 재귀 적으로 만들어야합니다. 루비에서 어떻게 할 수 있습니까?

답변:


197

사용 mkdir_p:

FileUtils.mkdir_p '/a/b/c'

_p당신은 또한 별칭을 사용할 수 있습니다 부모 / 경로에 대한 유닉스 홀드 오버입니다 mkpath그것은 당신을 위해 더 의미합니다.

FileUtils.mkpath '/a/b/c'

Ruby 1.9에서는 FileUtils가 코어에서 제거되었으므로 require 'fileutils'.


9
+1. FileUtils그리고 Pathname아마 루비 쉘 스크립트를위한 가장 중요한 도구를 제공합니다.
Jörg W Mittag

21

mkdir_p를 사용하여 재귀 적으로 디렉토리 생성

path = "/tmp/a/b/c"

FileUtils.mkdir_p(path) unless File.exists?(path)

5

unixy 머신에서 실행중인 경우 백틱에 넣어 루비에서 쉘 명령을 실행할 수 있다는 것을 잊지 마십시오.

`mkdir -p /a/b/c`

그렇게 긍정적 인 것은 그래도.
Matthew Schinckel 2017

1
시스템 명령을 하위 프로세스에 넣는 것은 최선의 방법이 아닙니다. 오류 처리, 결과 확인 등을 위해 Ruby 표준 라이브러리를 사용하는 것이 더 좋습니다.
noraj


2

구출 경로명 !

Pathname('/a/b/c/d.txt').dirname.mkpath

이것은 허용되는 답변보다 덜 직관적입니다. 또한 메서드에 대한 문서는 FileUtils ruby-doc.org/stdlib-2.6.5/libdoc/pathname/rdoc/…에
noraj

질문은 "파일을 /a/b/c/d.txt로 저장하고 싶지만 이러한 디렉토리가 있는지 여부를 모르겠습니다."입니다. 내 솔루션은 기존 파일 경로 ( '/a/b/c/d.txt')를 사용하고 별도의 구문 분석없이 모든 폴더를 만들 수 있습니다.
Vadym Tyemirov

동시에 FileUtils.mkdir_p '/a/b/c'+ 생성 d.txt을 허용한다는 의미 입니까?
noraj

아니, 대신 허용 Pathname('/a/b/c/d.txt').dirname.mkpathFile.write('/a/b/c/d.txt', content)없이 filename = '/a/b/c/d.txt'.rpartition('/').last및 구문 분석의 나머지
바딤 Tyemirov

0

자신의 논리를 사용할 수도 있습니다.

def self.create_dir_if_not_exists(path)
  recursive = path.split('/')
  directory = ''
  recursive.each do |sub_directory|
    directory += sub_directory + '/'
    Dir.mkdir(directory) unless (File.directory? directory)
  end
end

따라서 경로가 'tmp / a / b / c'이면 'tmp'가 존재하지 않으면 'tmp'가 생성되고 'tmp / a /'등이 생성됩니다.


하나는 바퀴를 재발 명하는 것을 피할 것입니다.
noraj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.