94

如何使用 ruby​​ 获取某个目录中存在的文件夹列表?

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

4

13 回答 13

113

我发现这更有用且易于使用:

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
于 2011-05-30T20:20:49.430 回答
74

乔丹很接近,但Dir.entries没有返回File.directory?预期的完整路径。试试这个:

 Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
于 2009-12-14T06:02:02.260 回答
48

在我看来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是绝对的,那么这些字符串也是绝对的。

于 2009-12-14T09:27:20.847 回答
20

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

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

非递归版本:

Dir.glob 'certain_directory/*/'

注意:Dir.[]Dir.glob.

于 2013-03-18T09:09:46.887 回答
5

有了这个,您可以以递归方式获取目录子目录子目录的完整路径数组。我使用该代码急切地将这些文件加载​​到文件中。config/application

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

此外,我们不再需要处理无聊的事情...。接受的答案需要处理它们。

于 2019-06-06T01:37:24.800 回答
4

您可以使用File.directory?fromFileTest模块来确定文件是否为目录。将其与Dir.entries一个很好的(ish)-liner 结合起来:

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

编辑:根据 ScottD 的更正进行更新。

于 2009-12-14T05:34:02.687 回答
4
directory = 'Folder'
puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
于 2009-12-14T09:05:24.000 回答
1
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
于 2013-08-26T18:16:56.180 回答
1
$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
于 2014-05-15T10:00:02.137 回答
1

对于您可能想要使用的通用解决方案

Dir.glob(File.expand_path(path))

这将适用~/*/于(您的主目录中的所有文件夹)之类的路径。

于 2017-08-25T15:12:39.093 回答
1

我们可以结合Borh 的答案johannes 的答案来获得一个非常优雅的解决方案来获取文件夹中的目录名称。

# 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 }
于 2017-12-07T03:26:52.670 回答
1

仅文件夹(不包括“.”和“..”):

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

文件夹和文件:

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

于 2018-01-26T11:17:27.013 回答
0

我认为您可以测试每个文件以查看它是否是带有FileTest.directory? (file_name). 有关更多信息,请参阅FileTest 的文档。

于 2009-12-14T05:32:06.200 回答