Getting a list of folders in a directory
RubyDirectoryDirectory ListingRuby Problem Overview
How do I get a list of the folders that exist in a certain directory with ruby?
Dir.entries()
looks close but I don't know how to limit to folders only.
Ruby Solutions
Solution 1 - Ruby
I've found this more useful and easy to use:
Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}
it gets all folders in the current directory, excluded .
and ..
.
To recurse folders simply use **
in place of *
.
The Dir.glob
line can also be passed to Dir.chdir
as a block:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
Solution 2 - Ruby
Jordan is close, but Dir.entries
doesn't return the full path that File.directory?
expects. Try this:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
Solution 3 - Ruby
In my opinion Pathname
is much better suited for filenames than plain strings.
require "pathname"
Pathname.new(directory_name).children.select { |c| c.directory? }
This gives you an array of all directories in that directory as Pathname objects.
If you want to have strings
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
If directory_name
was absolute, these strings are absolute too.
Solution 4 - Ruby
Recursively find all folders under a certain directory:
Dir.glob 'certain_directory/**/*/'
Non-recursively version:
Dir.glob 'certain_directory/*/'
Note: Dir.[]
works like Dir.glob
.
Solution 5 - Ruby
With this one, you can get the array of a full path to your directories, subdirectories, subsubdirectories in a recursive way.
I used that code to eager load these files inside config/application
file.
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
In addition we don't need deal with the boring .
and ..
anymore. The accepted answer needed to deal with them.
Solution 6 - Ruby
You can use File.directory?
from the FileTest
module to find out if a file is a directory. Combining this with Dir.entries
makes for a nice one(ish)-liner:
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
Edit: Updated per ScottD's correction.
Solution 7 - Ruby
directory = 'Folder'
puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
Solution 8 - Ruby
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
Solution 9 - Ruby
$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
Solution 10 - Ruby
For a generic solution you probably want to use
Dir.glob(File.expand_path(path))
This will work with paths like ~/*/
(all folders within your home directory).
Solution 11 - Ruby
We can combine Borh's answer and johannes' answer to get quite an elegant solution to getting the directory names in a folder.
# 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 }
Solution 12 - Ruby
Only folders ('.' and '..' are excluded):
Dir.glob(File.join(path, "*", File::SEPARATOR))
Folders and files:
Dir.glob(File.join(path, "*"))
Solution 13 - Ruby
I think you can test each file to see if it is a directory with FileTest.directory? (file_name)
. See the documentation for FileTest for more info.