查找包含特定文件的文件系统的大小和空闲空间

91 投票
12 回答
159822 浏览
提问于 2025-04-16 07:30

我在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 文件系统的解决方案,它们的可移植性甚至比这个还差。)

撰写回答