如何使用Dir.glob获取仅文件的列表?

时间:2011-10-06 16:22:47

标签: ruby

如何在指定目录中返回仅包含文件而非目录的列表?

我有my_list = Dir.glob(script_path.join("*"))

这将返回目录中的所有内容,包括子目录。我搜索但未能找到答案。

8 个答案:

答案 0 :(得分:27)

除了Mark的回答,Dir.entries还会回复目录。如果您只是想要这些文件,可以使用file?测试每个条目以查看它是文件还是目录。

Dir.entries('/home/theiv').select { |f| File.file?(f) }

/home/theiv替换为您要查找文件的目录。

另外,请查看File。它提供了一系列可以检索文件的测试和属性。

答案 1 :(得分:11)

Dir.glob('*').select { |fn| File.file?(fn) }

答案 2 :(得分:8)

我认为参赛作品不会进行短途旅行。如果您希望子目录中的文件也使用

puts Dir['**/*'].select { |f| File.file?(f) }

答案 3 :(得分:4)

如果你想一次性完成,而不是先创建一个数组然后用select迭代它,你可以这样做:

my_list = []
Dir.foreach(dir) { |f| my_list << f if File.file?(f) }

答案 4 :(得分:1)

您可以使用Dir[] / Dir.globDir.entries来获取文件列表。它们之间的区别在于前者返回完整路径,而后者只返回文件名。

所以要注意以下映射段.select {|f| File.file?(f)}:完整路径它运行良好,而只有文件名,它有时会有效。

FYR:

Dir[]Dir.globDir.entries

答案 5 :(得分:1)

按照@ karl-li在@theIV解决方案中的建议,我发现这很好用:

Dir.entries('path/to/files/folder').reject { |f| File.directory?(f) }

答案 6 :(得分:0)

您基本上可以使用File.basename(file)来获取文件名

Dir.glob(script_path.join("*")).map{ |s| File.basename(s) }

答案 7 :(得分:-3)

听起来你正在寻找Dir.entries

  

返回包含给定目录中所有文件名的数组。如果指定的目录不存在,将引发SystemCallError。

如果搜索Google如何解决此问题并未产生任何结果,您可以查看Ruby文档。