Qual è il modo più veloce e ottimizzato per ottenere un array di directory (esclusi i file) in Ruby?
Che ne dici di includere i file?
Qual è il modo più veloce e ottimizzato per ottenere un array di directory (esclusi i file) in Ruby?
Che ne dici di includere i file?
Risposte:
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
Invece di Dir.glob(foo)
puoi anche scrivere Dir[foo]
(tuttavia Dir.glob
può anche prendere un blocco, nel qual caso produrrà ogni percorso invece di creare un array).
Dir.glob("**/")
meno che tu non voglia anche link simbolici
File::FNM_DOTMATCH
flag.
Dir.glob("**/*", File::FNM_DOTMATCH)
Credo che nessuna delle soluzioni qui si occupi di directory nascoste (ad esempio '.test'):
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Find.find('/tmp').collect {|_|_}
È stato utile per me
Per l'elenco delle directory prova
Dir['**/']
L'elenco dei file è più difficile, perché nella directory Unix c'è anche un file, quindi è necessario testare il tipo o rimuovere le voci dall'elenco restituito che è genitore di altre voci.
Dir['**/*'].reject {|fn| File.directory?(fn) }
E per l'elenco di tutti i file e le directory semplicemente
Dir['**/*']
Solo directory
`find -type d`.split("\n")
Directory e file normali
`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? Mi piace la funzione in generale. Sembra che creerà un array di array? Sarebbe possibile eseguire la elseif
parte con: in rec_path(child, file) << child.to_s
modo da poterla assegnare a un array e ottenere un array di stringhe? Grazie!
Come notato in altre risposte qui, puoi usare Dir.glob
. Tieni presente che le cartelle possono contenere molti caratteri strani e gli argomenti glob sono modelli, quindi alcuni caratteri hanno significati speciali. In quanto tale, non è sicuro fare qualcosa di simile a quanto segue:
Dir.glob("#{folder}/**/*")
Invece fai:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
In PHP o in altri linguaggi per ottenere il contenuto di una directory e tutte le sue sottodirectory, devi scrivere alcune righe di codice, ma in Ruby ci vogliono 2 righe:
require 'find'
Find.find('./') do |f| p f end
questo stamperà il contenuto della directory corrente e tutte le sue sottodirectory.
O più breve, puoi usare la ’**’
notazione:
p Dir['**/*.*']
Quante righe scriverai in PHP o in Java per ottenere lo stesso risultato?
Sebbene non sia una soluzione a una riga, penso che questo sia il modo migliore per farlo usando le chiamate ruby.
Prima cancella tutti i file in modo ricorsivo
Secondo cancella tutte le directory vuote
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
Ecco un esempio che combina il rilevamento dinamico di una directory di progetto Rails con Dir.glob:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
config.assets.paths << Rails.root.join("app", "assets", "*")
, ma ancora non riuscivo a vedere le sottocartelle e i file all'interno della cartella delle risorse daRails.application.config.assets.paths