如何在ruby中递归创建目录?


101

我想将文件存储为/a/b/c/d.txt,但是我不知道这些目录中是否存在任何目录,并且在必要时需要递归创建它们。如何在红宝石中做到这一点?

Answers:


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 Shell脚本编写中最重要的工具。
约尔格W¯¯米塔格

21

使用mkdir_p递归创建目录

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

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

5

如果您在unixy机器上运行,请不要忘了,您始终可以通过将ruby命令放在反引号中来运行shell命令。

`mkdir -p /a/b/c`

虽然如此积极。
马修·辛克尔

1
将系统命令弹出子过程不是最好的主意。最好使用Ruby标准库来进行错误处理,检查结果等
。– noraj


2

抢救的路径名

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

这不像接受的答案那么直观。还将
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和解析的休息
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.