Ottenere un elenco di cartelle in una directory
-
19-09-2019 - |
Domanda
Come faccio a ottenere un elenco delle cartelle che esistono in una certa directory con Ruby?
Dir.entries()
sembra vicino, ma non so come limitare solo alle cartelle.
Soluzione
Jordan è vicino, ma Dir.entries
non restituisce il percorso completo che File.directory?
aspetta. Prova questo:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
Altri suggerimenti
Ho trovato questo più utile e facile da usare:
Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}
ottiene tutte le cartelle presenti nella directory corrente, .
esclusi e ..
.
Per ricorsivi cartelle semplicemente utilizzare **
al posto di *
.
La linea Dir.glob
può anche essere passato ad Dir.chdir
come blocco:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
A mio parere Pathname
è molto più adatto per i nomi dei file di stringhe semplici.
require "pathname"
Pathname.new(directory_name).children.select { |c| c.directory? }
Questo vi dà un array di tutte le directory in quella directory come oggetti percorso.
Se si desidera avere le stringhe
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
Se directory_name
era assoluta, queste stringhe sono assoluti troppo.
ricorsivamente trovare tutte le cartelle sotto una certa directory:
Dir.glob 'certain_directory/**/*/'
Non ricorsivamente versione:
Dir.glob 'certain_directory/*/'
Nota:. Dir.[]
funziona come Dir.glob
È possibile utilizzare File.directory?
dal modulo FileTest
per scoprire se un file è una directory. Combinando questo con Dir.entries
fa per una bella -liner uno (ish):
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory? File.join(directory, file}
Modifica:. Aggiornamento per la correzione di ScottD
directory = 'Folder'
puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
Con questo, è possibile ottenere la matrice di un percorso completo alla directory , sottodirectory , subsubdirectories in modo ricorsivo.
Ho usato il codice a carico desiderosi questi file all'interno di file config/application
.
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
Inoltre non abbiamo bisogno di affrontare il .
noioso e ..
più. La risposta accettata necessaria per trattare con loro.
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
Per una soluzione generica probabilmente si desidera utilizzare
Dir.glob(File.expand_path(path))
Questo funziona con percorsi come ~/*/
(tutte le cartelle all'interno della vostra home directory).
Solo le cartelle (e '..' sono escluse ''):
Dir.glob(File.join(path, "*", File::SEPARATOR))
Le cartelle ei file:
Dir.glob(File.join(path, "*"))
Credo che è possibile verificare ogni file per vedere se si tratta di una directory con FileTest.directory? (file_name)
. Vedere la documentazione per filestat per maggiori informazioni.
risposta di borh e Johannes risposta 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 }