查找包含特定文件的文件系统的大小和空闲空间
我在Linux上使用Python 2.6。请问最快的方法是什么:
如何确定哪个分区包含某个目录或文件?
举个例子,假设
/dev/sda2
挂载在/home
,而/dev/mapper/foo
挂载在/home/foo
。从字符串"/home/foo/bar/baz"
中,我想找出对应的分区和路径,比如("/dev/mapper/foo", "home/foo")
。然后,如何获取该分区的使用情况统计?比如,给定
/dev/mapper/foo
,我想知道这个分区的大小和可用的空闲空间(可以是字节数或者大概的兆字节数)。
12 个回答
55
从Python 3.3开始,使用标准库可以很简单直接地做到这一点:
$ cat free_space.py
#!/usr/bin/env python3
import shutil
total, used, free = shutil.disk_usage(__file__)
print(total, used, free)
$ ./free_space.py
1007870246912 460794834944 495854989312
这些数字是以字节为单位的。想了解更多信息,可以查看文档。
145
这个方法不能直接告诉你分区的名字,但你可以通过一个叫做 statvfs
的Unix系统调用来获取文件系统的统计信息。如果你想在Python中使用这个功能,可以用 os.statvfs('/home/foo/bar/baz')
。
根据POSIX标准,结果中有几个相关的字段:
unsigned long f_frsize Fundamental file system block size. fsblkcnt_t f_blocks Total number of blocks on file system in units of f_frsize. fsblkcnt_t f_bfree Total number of free blocks. fsblkcnt_t f_bavail Number of free blocks available to non-privileged process.
要理解这些值的意思,你需要把它们乘以 f_frsize
:
import os
statvfs = os.statvfs('/home/foo/bar/baz')
statvfs.f_frsize * statvfs.f_blocks # Size of filesystem in bytes
statvfs.f_frsize * statvfs.f_bfree # Actual number of free bytes
statvfs.f_frsize * statvfs.f_bavail # Number of free bytes that ordinary users
# are allowed to use (excl. reserved space)
51
如果你只需要查看设备上的可用空间,可以参考下面使用 os.statvfs()
的答案。
如果你还想知道与文件相关的设备名称和挂载点,就需要调用一个外部程序来获取这些信息。使用 df
命令可以提供你所需的所有信息——当你输入 df filename
时,它会打印出包含该文件的分区信息。
举个例子:
import subprocess
df = subprocess.Popen(["df", "filename"], stdout=subprocess.PIPE)
output = df.communicate()[0]
device, size, used, available, percent, mountpoint = \
output.split("\n")[1].split()
需要注意的是,这种方法有点脆弱,因为它依赖于 df
输出的具体格式,但我不知道有更可靠的解决方案。(下面有一些依赖于 /proc
文件系统的解决方案,它们的可移植性甚至比这个还差。)