Como criar diretórios recursivamente em ruby?

101

Quero armazenar um arquivo como /a/b/c/d.txt, mas não sei se algum desses diretórios existe e preciso criá-los recursivamente, se necessário. Como fazer isso em rubi?

Jan
fonte

Respostas:

197

Use mkdir_p:

FileUtils.mkdir_p '/a/b/c'

O _pé um resquício do Unix para pai / caminho, você também pode usar o alias mkpathse isso fizer mais sentido para você.

FileUtils.mkpath '/a/b/c'

No Ruby 1.9, o FileUtils foi removido do núcleo, então você terá que fazer isso require 'fileutils'.

Harmon Wood
fonte
9
+1. FileUtilse Pathnamesão provavelmente as ferramentas mais importantes para scripts de shell Ruby.
Jörg W Mittag
21

Use mkdir_p para criar diretório recursivamente

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

FileUtils.mkdir_p(path) unless File.exists?(path)
ferbass
fonte
5

Se você estiver executando em máquinas unixy, não se esqueça que você sempre pode executar um comando shell no ruby, colocando-o em crases.

`mkdir -p /a/b/c`
Matthew Schinckel
fonte
Embora seja tão positivo.
Matthew Schinckel de
1
Colocar o comando do sistema no subprocesso não é a melhor ideia. É melhor fazer isso com a biblioteca padrão Ruby para obter tratamento de erros, verificar o resultado, etc.
noraj
2

Pathname para o resgate!

Pathname('/a/b/c/d.txt').dirname.mkpath
Vadym Tyemirov
fonte
Isso é menos intuitivo do que a resposta aceita. Também o documento para o método encaminhado para FileUtils ruby-doc.org/stdlib-2.6.5/libdoc/pathname/rdoc/…
noraj
A pergunta é: "Quero armazenar um arquivo como /a/b/c/d.txt, mas não sei se algum desses diretórios existe". Minha solução permite usar o caminho do arquivo existente ('/a/b/c/d.txt') e, sem análise separada, criar todas as pastas.
Vadym Tyemirov
Quer dizer que isso permite fazer FileUtils.mkdir_p '/a/b/c'+ criar d.txtao mesmo tempo?
noraj
Não, em vez disso, permite Pathname('/a/b/c/d.txt').dirname.mkpathe File.write('/a/b/c/d.txt', content)sem filename = '/a/b/c/d.txt'.rpartition('/').laste o resto da análise
Vadym Tyemirov
0

Você também pode usar sua própria lógica

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

Portanto, se o caminho for 'tmp / a / b / c' se 'tmp' não existir, 'tmp' será criado, então 'tmp / a /' e assim por diante.

kamal patwa
fonte
Evitaríamos reinventar a roda.
noraj