获取目录中的文件夹列表

时间:2009-12-14 05:26:06

标签: ruby directory directory-listing

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

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

13 个答案:

答案 0 :(得分:98)

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

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

答案 1 :(得分:64)

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

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

答案 2 :(得分:44)

在我看来,Pathname比普通字符串更适合文件名。

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

这为您提供了该目录中所有目录的数组作为Pathname对象。

如果你想要字符串

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

如果directory_name是绝对的,那么这些字符串也是绝对的。

答案 3 :(得分:20)

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

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

非递归版本:

Dir.glob 'certain_directory/*/'

注意:Dir.[]的作用类似于Dir.glob

答案 4 :(得分:4)

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

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

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

答案 5 :(得分:4)

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

答案 6 :(得分:1)

Dir.glob('/your_dir').reject {|e| !File.directory?(e)}

答案 7 :(得分: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

答案 8 :(得分:1)

对于通用解决方案,您可能希望使用

Dir.glob(File.expand_path(path))

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

答案 9 :(得分:1)

仅排除文件夹('。'和'..'):

protected $primaryKey = 'user_menu_id';

文件夹和文件:

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

答案 10 :(得分:1)

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

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

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

答案 11 :(得分:0)

我认为您可以测试每个文件以查看它是否是FileTest.directory? (file_name)的目录。有关详细信息,请参阅the documentation for FileTest

答案 12 :(得分:0)

我们可以将Borh's answerjohannes' answer结合起来,以获得将目录名称放在文件夹中的优雅解决方案。

db.collection("samyata")
    .document(mAuth.getuid.toString())
    .collection("wallet")
    .document(mAuth.getuid.toString())
    .setData(dataToSave);