Come ottengo un elenco delle cartelle che esistono in una determinata directory con ruby?
Dir.entries()
sembra vicino ma non so come limitare solo alle cartelle.
Come ottengo un elenco delle cartelle che esistono in una determinata directory con ruby?
Dir.entries()
sembra vicino ma non so come limitare solo alle cartelle.
Risposte:
Jordan è vicino, ma Dir.entries
non restituisce il percorso completo che si File.directory?
aspetta. Prova questo:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
Dir.glob
.
Dir.glob()
come visto nell'altra risposta - Consiglio vivamente di farlo invece di questo
L'ho trovato più utile e facile da usare:
Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}
ottiene tutte le cartelle nella directory corrente, escluse .
e ..
.
Per ricorrere **
alle cartelle è sufficiente utilizzare al posto di *
.
La Dir.glob
linea può anche essere passata Dir.chdir
come blocco:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
**/*
al posto di *
.
A mio parere Pathname
è molto più adatto per i nomi dei file rispetto alle semplici stringhe.
require "pathname"
Pathname.new(directory_name).children.select { |c| c.directory? }
Questo ti dà un array di tutte le directory in quella directory come oggetti Pathname.
Se vuoi avere delle stringhe
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
Se directory_name
era assoluto, anche queste stringhe sono assolute.
Pathname
è che rimuove automaticamente .
, ..
e file proprietery come.DS_Store
Trova ricorsivamente tutte le cartelle in una determinata directory:
Dir.glob 'certain_directory/**/*/'
Versione non ricorsiva:
Dir.glob 'certain_directory/*/'
Nota: Dir.[]
funziona come Dir.glob
.
È possibile utilizzare File.directory?
dal FileTest
modulo per scoprire se un file è una directory. La combinazione di questo con Dir.entries
rende un bel (ish) -liner:
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
Modifica: aggiornato in base alla correzione di ScottD.
Con questo, è possibile ottenere la matrice di un percorso completo per le vostre directory , sottodirectory , subsubdirectories in modo ricorsivo. Ho usato quel codice per caricare ansiosamente questi file all'interno del config/application
file.
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
Inoltre non abbiamo bisogno di affrontare il noioso .
e ..
più. La risposta accettata era necessaria per affrontarli.
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
reject !
,select
$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
Per una soluzione generica che probabilmente vorrai usare
Dir.glob(File.expand_path(path))
Funzionerà con percorsi come ~/*/
(tutte le cartelle all'interno della directory home).
Siamo in grado di combinare la risposta di borh e risposta di Johannes per ottenere una soluzione elegante abbastanza per ottenere i nomi delle directory in una cartella.
# 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 }
Penso che tu possa testare ogni file per vedere se è una directory con FileTest.directory? (file_name)
. Consulta la documentazione di FileTest per maggiori informazioni.
'.'
(directory corrente) e'..'
(genitore della directory corrente). Nella maggior parte dei casi, vuoi rimuovere almeno quei due.