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?
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?
Respostas:
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
Em vez de, Dir.glob(foo)
você também pode escrever Dir[foo]
(no entanto, Dir.glob
também pode pegar um bloco, caso em que produzirá cada caminho em vez de criar uma matriz).
Dir.glob("**/")
menos que você também queira links simbólicos
File::FNM_DOTMATCH
sinalizador.
Dir.glob("**/*", File::FNM_DOTMATCH)
Acredito que nenhuma das soluções aqui lida com diretórios ocultos (por exemplo, '.test'):
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Find.find('/tmp').collect {|_|_}
Foi útil para mim
Para uma lista de diretórios, tente
Dir['**/']
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.
Dir['**/*'].reject {|fn| File.directory?(fn) }
E para a lista de todos os arquivos e diretórios simplesmente
Dir['**/*']
Apenas diretórios
`find -type d`.split("\n")
Diretórios e arquivos normais
`find -type d -or -type f`.split("\n")`
require "pathname"
def rec_path(path, file= false)
puts path
path.children.collect do |child|
if file and child.file?
child
elsif child.directory?
rec_path(child, file) + [child]
end
end.select { |x| x }.flatten(1)
end
# only directories
rec_path(Pathname.new(dir), false)
# directories and normal files
rec_path(Pathname.new(dir), true)
end.select {}.flatten()
parte? Eu gosto da função geral. Parece que vai criar um array de arrays? Seria possível fazer a elseif
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:
Dir.glob("#{folder}/**/*")
Em vez disso, faça:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
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:
require 'find'
Find.find('./') do |f| p f end
isso imprimirá o conteúdo do diretório atual e todos os seus subdiretórios.
Ou mais curto, você pode usar a ’**’
notação:
p Dir['**/*.*']
Quantas linhas você escreverá em PHP ou em Java para obter o mesmo resultado?
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
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
Aqui está um exemplo que combina a descoberta dinâmica de um diretório de projeto Rails com Dir.glob:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
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