递归获取目录大小

7

有没有一个好用的gem用于递归计算目录大小?在Unix中,我可以使用du,但我想要一个能够吸收不同操作系统差异的库。


相关:http://stackoverflow.com/questions/3632074/what-is-the-fastest-way-to-calculate-disk-usage-per-customer - coreyward
1
相关:https://dev59.com/tW855IYBdhLWcg3wJgxy - coreyward
6个回答

5
这似乎可以工作:
Dir.glob(File.join(dir, '**', '*'))
  .map{ |f| File.size(f) }
  .inject(:+)

我认为你实际上只是使用 (&:size) 获取字符串的长度。相反,你想要的是 { |file| File.size(file) } - Ryan Lue
1
或者使用 sum 代替 inject(:+)(在 Ruby 2.6.4 上测试过)。 - builder-7000

2

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'

1

看起来 sys-filesystem 可以处理这个问题,但你需要做一些数学计算将可用的块转换成字节(通过乘以块大小)。


2
这可能是由于回答时间过长,但所提到的 gem 正确地确定了块大小(以及字节大小,参见 bytes_{used,total,free}),仅适用于文件系统(= 挂载)级别,并且似乎无法确定目录的大小。 - oliverguenther

-2

2
我猜你被踩是因为这个代码只返回了目录的大小,而没有返回目录内容的总大小。 - d11wtq

-3

支持工具:

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


这并不清楚如何解决问题。你需要解释一下。 - New Alexandria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接