如何使用 ruby 获取某个目录中存在的文件夹列表?
Dir.entries()
看起来很接近,但我不知道如何仅限于文件夹。
我发现这更有用且易于使用:
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
乔丹很接近,但Dir.entries
没有返回File.directory?
预期的完整路径。试试这个:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
在我看来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
.
有了这个,您可以以递归方式获取目录、子目录、子目录的完整路径数组。我使用该代码急切地将这些文件加载到文件中。config/application
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
此外,我们不再需要处理无聊的事情.
了..
。接受的答案需要处理它们。
您可以使用File.directory?
fromFileTest
模块来确定文件是否为目录。将其与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)}
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))
这将适用~/*/
于(您的主目录中的所有文件夹)之类的路径。
我们可以结合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 }
仅文件夹(不包括“.”和“..”):
Dir.glob(File.join(path, "*", File::SEPARATOR))
文件夹和文件:
Dir.glob(File.join(path, "*"))
我认为您可以测试每个文件以查看它是否是带有FileTest.directory? (file_name)
. 有关更多信息,请参阅FileTest 的文档。