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.

È stato utile?

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 }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top