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.

Foi útil?

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 }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top