Rubyでディレクトリを再帰的に作成する方法は?


101

ファイルを/a/b/c/d.txtとして保存したいのですが、これらのディレクトリが存在するかどうかわからないため、必要に応じて再帰的に作成する必要があります。どうすればルビでこれを行うことができますか?

回答:


197

使用mkdir_p

FileUtils.mkdir_p '/a/b/c'

これ_pは、親/パスのUNIXホールドオーバーmkpathであり、より意味のある場合はエイリアスを使用することもできます。

FileUtils.mkpath '/a/b/c'

Ruby 1.9ではコアからFileUtilsが削除されたため、を実行する必要がありますrequire 'fileutils'


9
+1。FileUtilsそしてPathnameおそらくRubyシェルスクリプトのため最も重要なツールです。
イェルクWミッターク

21

mkdir_pを使用してディレクトリを再帰的に作成します

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

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

5

unixyマシンで実行している場合は、常にバックティックに配置することで、rubyの下でシェルコマンドを実行できることを忘れないでください。

`mkdir -p /a/b/c`

とてもポジティブであることはしかしです。
Matthew Schinckel 2017年

1
システムコマンドをサブプロセスにポップするのは最善の方法ではありません。エラー処理、結果の確認などを行うには、Ruby標準ライブラリを使用することをお
勧めします


2

救助へのパス名

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

これは、受け入れられた回答よりも直感的ではありません。またのfileutilsへのforwardメソッドのためのドキュメントは、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.mkpathし、File.write('/a/b/c/d.txt', content)なしfilename = '/a/b/c/d.txt'.rpartition('/').lastと解析の残りの部分
Vadym 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.