如何使用ruby在目录中获取文件数

时间:2011-07-21 08:45:15

标签: ruby file-io directory

使用ruby如何获取给定目录中的文件数量,文件计数应包括来自递归目录的计数。

例如:folder1(2个文件)-----> folder2(4个文件)     和folder2在folder1中。 上述案例的总数应为6个文件。

ruby​​中是否有任何函数可以获取此数据。

8 个答案:

答案 0 :(得分:35)

最快的方法应该是(不包括计数中的目录):

Dir.glob(File.join(your_directory_as_variable_or_string, '**', '*')).select { |file| File.file?(file) }.count

更短:

dir = '~/Documents'
Dir[File.join(dir, '**', '*')].count { |file| File.file?(file) }

答案 1 :(得分:25)

您只需要这样,在当前目录中运行。

Dir["**/*"].length

它将目录计为文件。

答案 2 :(得分:7)

稍作修改和评论

Dir['**/*'].count { |file| File.file?(file) }

在Ruby 1.9.3中适合我,并且更短。

至少在我的Windows 7机顶上,一个警告是Dir['somedir/**/*']不起作用。我必须使用

cd(somedir) { Dir['**/*'] }

答案 3 :(得分:3)

你也可以超级骨干并执行系统命令:

count = `ls -1 #{dir} | wc -l`.to_i 

答案 4 :(得分:1)

以下内容如何:

find . -typef|wc -l

另外,在Dir.count方法上使用它有什么缺点?

答案 5 :(得分:0)

请尝试:

//we suppose that the variable folder1 is an absolute path here
pattern = File.join(folder1, "**", "*")
count = Dir.glob(pattern).count

答案 6 :(得分:0)

对于非常大的文件夹,窗口中最快的方法是使用这样的command line version of search everything,不知道Linus是否有像Search Everything这样的东西..如果有,请告诉我们。

ES = 'C:\Users\...\everything\es\es.exe'

def filelist path
  command = %Q{"#{ES}" "#{path}\\*"}
  list = []
  IO.popen(command+" 2>&1") do |pipe|
    while lijn = pipe.gets
      list << lijn
    end
  end
  list
end

filelist(path).count

在这里查看相对较小的文件夹(+800文件)的结果

Benchmark.bmbm do |x| 
  x.report("glob      ") { filelist(path).count }
  x.report("everything") { Dir.glob("#{folder}/**/*").count } 
end 

Rehearsal ----------------------------------------------
glob         0.000000   0.032000   0.032000 (  0.106887)
everything   0.000000   0.000000   0.000000 (  0.001979)
------------------------------------- total: 0.032000sec

                 user     system      total        real
glob         0.016000   0.015000   0.031000 (  0.110030)
everything   0.000000   0.016000   0.016000 (  0.001881)

答案 7 :(得分:0)

~/Documents为例。

一个行代码:

Dir['~/Documents'].length

对于较长的路径,一行的可读性可能较低,因此:

path = '~/Documents/foo/bar'

Dir[path].length