Obtendo uma lista de pastas em um diretório
-
19-09-2019 - |
Pergunta
Como faço para obter uma lista das pastas que existem em um determinado diretório com rubi?
aparência Dir.entries()
perto, mas eu não sei como limite para pastas somente.
Solução
Jordan está perto, mas Dir.entries
não retorna o caminho completo que espera File.directory?
. Tente isto:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
Outras dicas
Eu encontrei este mais útil e fácil de usar:
Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}
fica todas as pastas no diretório atual, .
excluídos e ..
.
Para recurse pastas simplesmente usar **
no lugar de *
.
A linha de Dir.glob
podem também ser passados ??para Dir.chdir
como um bloco:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
Na minha opinião Pathname
é muito mais adequado para nomes de arquivos do que seqüências de caracteres simples.
require "pathname"
Pathname.new(directory_name).children.select { |c| c.directory? }
Isto dá-lhe um array de todos os diretórios no diretório como Pathname objetos.
Se você quiser ter cordas
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
Se directory_name
era absoluto, essas cadeias são absolutos também.
Recursively encontrar todas as pastas sob 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?
do módulo FileTest
para descobrir se um arquivo é um diretório. Combinando isso com Dir.entries
marcas para uma agradável (ish) -liner:
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory? File.join(directory, file}
Editar:. Atualizado por correção de ScottD
directory = 'Folder'
puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
Com este, você pode obter a matriz de um caminho completo para a sua diretórios , subdiretórios , subsubdirectories de forma recursiva.
Eu usei esse código para carregar ansiosos esses arquivos dentro do arquivo config/application
.
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
Além disso, nós não precisamos lidar com a .
chato e ..
mais. A resposta aceita necessária para lidar com eles.
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
$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 vai querer usar
Dir.glob(File.expand_path(path))
Isto irá funcionar com caminhos como ~/*/
(todas as pastas dentro do seu diretório home).
Somente as pastas (e '..' são excluídos ''):
Dir.glob(File.join(path, "*", File::SEPARATOR))
As pastas e arquivos:
Dir.glob(File.join(path, "*"))
Eu acho que você pode testar cada arquivo para ver se ele é um diretório com FileTest.directory? (file_name)
. Consulte a documentação para FileTest para mais informações.
Podemos combinar resposta de borh e Johannes resposta 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 }