使用ruby如何获取给定目录中的文件数量,文件计数应包括来自递归目录的计数。
例如:folder1(2个文件)-----> folder2(4个文件) 和folder2在folder1中。 上述案例的总数应为6个文件。
ruby中是否有任何函数可以获取此数据。
答案 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