Qual é a maneira mais rápida e otimizada de uma linha para obter um array de diretórios (excluindo arquivos) em Ruby?
Que tal incluir arquivos?
ruby
filesystems
recursion
Lance Pollard
fonte
fonte
Respostas:
Em vez de,
Dir.glob(foo)
você também pode escreverDir[foo]
(no entanto,Dir.glob
também pode pegar um bloco, caso em que produzirá cada caminho em vez de criar uma matriz).Ruby Glob Docs
fonte
Dir.glob("**/")
menos que você também queira links simbólicosFile::FNM_DOTMATCH
sinalizador.Dir.glob("**/*", File::FNM_DOTMATCH)
Acredito que nenhuma das soluções aqui lida com diretórios ocultos (por exemplo, '.test'):
fonte
Find.find('/tmp').collect {|_|_}
Foi útil para mimPara uma lista de diretórios, tente
Lista de arquivos é mais difícil, porque no diretório Unix também é um arquivo, então você precisa testar o tipo ou remover as entradas da lista retornada que é pai de outras entradas.
E para a lista de todos os arquivos e diretórios simplesmente
fonte
Fast one liner
Apenas diretórios
Diretórios e arquivos normais
Rubi lindo puro
fonte
end.select {}.flatten()
parte? Eu gosto da função geral. Parece que vai criar um array de arrays? Seria possível fazer aelseif
parte com:rec_path(child, file) << child.to_s
para que você pudesse atribuí-la a um array e obter um array de strings? Obrigado!Conforme observado em outras respostas aqui, você pode usar
Dir.glob
. Lembre-se de que as pastas podem conter muitos caracteres estranhos e os argumentos glob são padrões, portanto, alguns caracteres têm significados especiais. Como tal, não é seguro fazer algo como o seguinte:Em vez disso, faça:
fonte
Em PHP ou outras linguagens, para obter o conteúdo de um diretório e todos os seus subdiretórios, você deve escrever algumas linhas de código, mas em Ruby são necessárias 2 linhas:
isso imprimirá o conteúdo do diretório atual e todos os seus subdiretórios.
Ou mais curto, você pode usar a
’**’
notação:Quantas linhas você escreverá em PHP ou em Java para obter o mesmo resultado?
fonte
Embora não seja uma solução de uma linha, acho que essa é a melhor maneira de fazer isso usando chamadas de ruby.
Primeiro apague todos os arquivos recursivamente
Segundo apague todos os diretórios vazios
fonte
Aqui está um exemplo que combina a descoberta dinâmica de um diretório de projeto Rails com Dir.glob:
fonte
config.assets.paths << Rails.root.join("app", "assets", "*")
, mas ainda não conseguia ver as subpastas e arquivos dentro da pasta de ativos porRails.application.config.assets.paths
pontos retornam nulo, use compacto
fonte