如何获取存在于某个目录红宝石?

文件夹列表

Dir.entries()看起来接近,但我不知道如何限制文件夹只。

有帮助吗?

解决方案

乔丹接近,但Dir.entries不返回File.directory?预计的完整路径。尝试这样:

 Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }

其他提示

我找到这个更加有用和容易使用

Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}

它得到在当前目录中的所有文件夹,排除...

要递归的文件夹简单地使用**代替*的。

Dir.glob线也可以被传递到Dir.chdir作为一个块:

Dir.chdir('/destination directory') do
  Dir.glob('*').select { |f| File.directory? f }
end

在我的意见Pathname为文件名比普通字符串更适合。

require "pathname"
Pathname.new(directory_name).children.select { |c| c.directory? }

此可以提供所有的目录在该目录路径名作为对象的数组。

如果你想有一个字符串

Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }

如果directory_name是绝对的,这些字符串是绝对太

递归查找某一目录下的所有文件夹:

Dir.glob 'certain_directory/**/*/'

非递归版本:

Dir.glob 'certain_directory/*/'

注意:Dir.[]就像Dir.glob

您可以使用File.directory?FileTest模块,以找出一个文件是一个目录。与Dir.entries结合这使得一个好一个(ISH)-liner:

directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory? File.join(directory, file}

修改:每ScottD的校正更新

directory = 'Folder'
puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}

通过这一个,你可以得到的完整路径的阵列以您的目录子目录 subsubdirectories 在递归的方式。 我用代码来急切装载这些文件config/application文件内。

Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }

此外,我们并不需要处理枯燥的...了。需要接受的答案来对付他们。

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

有关你可能想使用一个通用的解决方案。

Dir.glob(File.expand_path(path))

这将像~/*/路径(你的home目录中的所有文件夹)的工作。

只有文件夹( '..' 被排除 ''):

Dir.glob(File.join(path, "*", File::SEPARATOR))

文件夹和文件:

Dir.glob(File.join(path, "*"))

我觉得你可以测试每个文件,看它是否与FileTest.directory? (file_name)目录。请参阅获得更多信息。

我们可以结合 Borh的回答和的约翰的回答得到一个相当优雅的解决方案的文件夹中获取目录名。

# 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 }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top