在Ruby中获取可用磁盘空间

29

使用 Ruby 获取磁盘空间信息的最佳方法是什么?我倾向于使用纯 Ruby 方案。如果不可能(即使使用其他 gem),也可以使用标准 Ubuntu 桌面安装中可用的任何命令将信息解析为 Ruby。


在Windows或Linux下?如果是Windows,这里有一个相关问题:https://dev59.com/Xk_Sa4cB1Zd3GeqP9Rk5 - Saif al Harthi
11个回答

39
你可以使用 sys-filesystem gem(跨平台友好)
require 'sys/filesystem'

stat = Sys::Filesystem.stat("/")
mb_available = stat.block_size * stat.blocks_available / 1024 / 1024

1
有没有办法在Linux和Windows中使用Ruby获取根磁盘的总剩余空间,而不使用任何gem? - NN796

9
如何简单地实现呢:
spaceMb_i = `df -m /dev/sda1`.split(/\b/)[24].to_i

其中'/dev/sda1'是路径,可以通过运行df命令来确定


由于某些原因(分割?),这对我不起作用,但是这个可以:bytes_free = \df -B1 .`.split[10].to_i`。 - rogerdpack
1
有没有办法在Linux和Windows中使用Ruby获取根磁盘的总剩余空间,而不使用任何gem? - NN796

5
(Ruby)Daniel Berger在这个领域维护了许多宝石。可以在那里找到:sys-cpu,sys-uptime,sys-uname,sys-proctable,sys-host,sys-admin,sys-filesystem。据我所知,它们是跨平台的。

4
这是对dkams答案的补充,虽然不错,但计算了整个驱动器的空间,为了检查剩余可用空间,即驱动器上的FREE空间,请使用以下代码替换kdams第二行:
gb_available = stat.bytes_free / 1024 / 1024 / 1024

这将返回您驱动器剩余的可用空间(以千兆字节为单位)。

3
如果它是以吉字节为单位,为什么还称其为mb_available? - zachaysan
@zachaysan 这是因为参数的单位是 1024 / 1024 / 1024,从字节到兆字节再到千兆字节。看到 bytes_free 应该就能明白了。mb_available 是标准的数据显示方式,除非它小于1MB。不过你可以通过参数控制想要的单位(KB、MB、GB)。 - DotSlashCoding
@DotSlashCoding 如果 bytes_free 返回字节(它确实是这样),然后我们将其除以1024三次,我们就可以得到:字节->千字节->兆字节->千兆字节。所以@zachaysan的问题是为什么变量被命名为mb_available而不是更准确的gb_available - aidan
@DotSlashCoding 我会期望一个名为 mb_available 的变量包含一个数字,该数字代表可用的兆字节数量,同时我也会期望一个名为 gb_available 的变量包含一个数字,该数字代表可用的千兆字节数量。但是在上面的答案中,我们将“可用的千兆字节数量”存储在一个名称暗示它实际上存储“可用的兆字节数量”的变量中 - 这是具有误导性的,应该避免。 - aidan
2
大家好,是的我犯了一个错误,谢谢你们,变量应该被称为gb_available。 - diegeelvis_SA
显示剩余2条评论

4

您好,我已经为此创建了一个宝石(gem):https://github.com/pr0d1r2/free_disk_space

您可以这样使用它:

gem 'free_disk_space' # 将此行添加到 Gemfile 文件中

在代码中使用以下方法:

FreeDiskSpace.terabytes('/')

FreeDiskSpace.gigabytes('/')

FreeDiskSpace.megabytes('/')

FreeDiskSpace.kilobytes('/')

FreeDiskSpace.bytes('/')


2
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。仅链接的答案如果链接页面更改,则可能变得无效。 - zero323
7年未更新的宝石已经没有什么用处了。 - fatfrog
宝石根据当前接受的回应生成一个基于类的代码,因此可以放心使用@fatfrog,或者将该文件复制到您的项目中。 - Jorge Sampayo

1

这仅适用于Linux系统:如果您不介意调用shell,可以使用df命令获取文件系统信息并使用正则表达式解析输出:

fs_to_check = '/boot'
df_output = `df #{fs_to_check}`
disk_line = df_output.split(/\n/)[1]
disk_free_bytes = disk_line.match(/(.+)\s+(\d+)\s+(\d+)\s+(\d+)\s+/)[4].to_i
disk_free_mbs = disk_free_bytes / 1024
puts(disk_free_mbs)

有没有办法在Linux和Windows中使用Ruby获取根磁盘的总剩余空间,而不使用任何gem? - NN796

1

与rogerdpack的评论类似,为了获得以GB/MB为单位的可用空间,您可以尝试以下操作

# Get free space in Gb in present partition
gb_free = `df -BG .`.split[10].to_i

# Get free space in MB in /dev/sda1 partition
mb_free = `df -BM /dev/sda1`.split[10].to_i
puts  gb_free, mb_free

双星号(**)是什么意思? - hagello

0

我的无需使用 gem 的解决方案(仅适用于 Linux):

storage_info = `df -h | grep "sda1" -w`

# storage_info => "/dev/sda1        39G   27G   12G  70% /"

然后根据您可能需要的确切信息(总空间、已用空间、可用空间、百分比中的已用空间),您可以执行以下操作:

free_space = storage_info.split(" ")[3]

# free_space => "12G"

0

我相信这更加健壮可靠。

filesystem = "/dev/sda1"
free_megabytes = `LANG=C df -m #{filesystem}`.split("\n").map do |line|
  line.split.first(4)
end.transpose.to_h["Available"]&.to_i
puts(free_megabytes)

0
def check_disk_space
  system('df -H | grep debug > ff')
  ss = File.open('ff').read.split(/\s+/)
  system('rm ff')
  "#{ss[3]}"
end

在Ubuntu上使用,用于检查调试文件的大小,并将可用大小作为输出。


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