递归获取目录大小
Posted
技术标签:
【中文标题】递归获取目录大小【英文标题】:Recursively getting the size of a directory 【发布时间】:2012-02-19 23:59:51 【问题描述】:有没有一个很好的 gem 来获取递归计算的目录大小?在unix中,我可以使用du
,但我想要一个吸收操作系统差异的库。
【问题讨论】:
相关:***.com/questions/3632074/… 相关:***.com/questions/4508692/… 【参考方案1】:这似乎有效:
Dir.glob(File.join(dir, '**', '*'))
.map |f| File.size(f)
.inject(:+)
【讨论】:
我认为您实际上只是在获取带有(&:size)
的字符串的长度。你想要的是 |file| File.size(file)
。
或者使用sum
而不是inject(:+)
(在Ruby 2.6.4上测试)【参考方案2】:
这样的东西对你有用吗?
def directory_size(path)
path << '/' unless path.end_with?('/')
raise RuntimeError, "#path is not a directory" unless File.directory?(path)
total_size = 0
Dir["#path**/*"].each do |f|
total_size += File.size(f) if File.file?(f) && File.size?(f)
end
total_size
end
puts directory_size '/etc'
【讨论】:
【参考方案3】:这是我使用 http://ruby-doc.org/core-2.2.0/File.html#method-c-size 的解决方案:
def directory_size(path)
size=0
Dir.glob(File.join(path, '**', '*')) |file| size+=File.size(file)
size
end
【讨论】:
【参考方案4】:看起来sys-filesystem 处理了这个问题,但您需要做一些数学运算才能将可用块转换为字节(通过乘以块大小)。
【讨论】:
这可能是由于自此答案以来经过了很长时间,但提到的 gem 正确地确定了块大小(以及以字节为单位的大小,参见bytes_used,total,free
仅在文件系统(=mount)级别并且似乎无法确定目录的大小。【参考方案5】:
查看File::Stat
类(注意它不计算目录内容的大小,需要手动完成)。
file = File::Stat.new('.')
puts file.size
http://ruby-doc.org/core-1.9.3/File/Stat.html#method-i-size
【讨论】:
我假设您被否决了,因为这会返回目录的大小,而不是目录内容的组合大小。【参考方案6】:支持工具:
diruse /M %windir%
diruse /K /S %windir%
diruse /S %windir%
diruse /, %windir%
微软...系统安装光盘
msiexec /i %cd:~0,2%\SUPPORT\TOOLS\SUPTOOLS.MSI /q addlocal=all
Sysinternals 套件实用程序:
du.exe -l 1 %windir%
微软...
Sysinternals Suite
【讨论】:
目前尚不清楚这如何解决问题。你需要解释一下以上是关于递归获取目录大小的主要内容,如果未能解决你的问题,请参考以下文章