Como faço para obter uma lista das pastas que existem em um determinado diretório com ruby?
Dir.entries()
parece perto, mas não sei como limitar apenas a pastas.
Como faço para obter uma lista das pastas que existem em um determinado diretório com ruby?
Dir.entries()
parece perto, mas não sei como limitar apenas a pastas.
Respostas:
Jordan está perto, mas Dir.entries
não retorna o caminho completo que File.directory?
espera. Experimente isto:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
Dir.glob
.
Dir.glob()
que visto na outra resposta - eu recomendo fortemente apenas fazer isso em vez disso
Achei isso mais útil e fácil de usar:
Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}
ele obtém todas as pastas no diretório atual, excluídas .
e..
.
Para recobrir pastas, basta usar **
no lugar de*
.
A Dir.glob
linha também pode ser passada Dir.chdir
como um bloco:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
**/*
no lugar de *
.
Em minha opinião, Pathname
é muito mais adequado para nomes de arquivos do que strings simples.
require "pathname"
Pathname.new(directory_name).children.select { |c| c.directory? }
Isso fornece uma matriz de todos os diretórios naquele diretório como objetos Pathname.
Se você quiser ter cordas
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
Se directory_name
fosse absoluto, essas strings também seriam absolutas.
Pathname
é que ele remove automaticamente .
, ..
e arquivos de propriedade como.DS_Store
Encontre recursivamente todas as pastas em um determinado diretório:
Dir.glob 'certain_directory/**/*/'
Versão não recursiva:
Dir.glob 'certain_directory/*/'
Nota: Dir.[]
funciona como Dir.glob
.
Você pode usar File.directory?
o FileTest
módulo para descobrir se um arquivo é um diretório. Combinar isso com Dir.entries
faz um belo forro (ish):
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
Edit: Atualizado de acordo com a correção de ScottD.
Com este, você pode obter a matriz de um caminho completo para seus diretórios , subdiretórios , subsubdiretórios de forma recursiva. Usei esse código para carregar ansiosamente esses arquivos dentro do config/application
arquivo.
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
Além disso, não precisamos lidar com o chato .
e ..
mais. A resposta aceita precisava lidar com eles.
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
reject !
,select
$dir_target = "/Users/david/Movies/Camtasia 2/AzureMobileServices.cmproj/media"
Dir.glob("#{$dir_target}/**/*").each do |f|
if File.directory?(f)
puts "#{f}\n"
end
end
Para uma solução genérica que você provavelmente deseja usar
Dir.glob(File.expand_path(path))
Isso funcionará com caminhos como ~/*/
(todas as pastas em seu diretório inicial).
Podemos combinar a resposta de borh e resposta Johannes a ficar bastante uma solução elegante para obter os nomes de diretório em uma pasta.
# user globbing to get a list of directories for a path
base_dir_path = ''
directory_paths = Dir.glob(File.join(base_dir_path, '*', ''))
# or recursive version:
directory_paths = Dir.glob(File.join(base_dir_path, '**', '*', ''))
# cast to Pathname
directories = directory_paths.collect {|path| Pathname.new(path) }
# return the basename of the directories
directory_names = directories.collect {|dir| dir.basename.to_s }
Acho que você pode testar cada arquivo para ver se é um diretório com FileTest.directory? (file_name)
. Consulte a documentação do FileTest para obter mais informações.
'.'
(diretório atual) e'..'
(pai do diretório atual). Na maioria dos casos, você deseja remover pelo menos esses dois.