Find size and free space of the filesystem containing a given file Find size and free space of the filesystem containing a given file linux linux

Find size and free space of the filesystem containing a given file


This doesn't give the name of the partition, but you can get the filesystem statistics directly using the statvfs Unix system call. To call it from Python, use os.statvfs('/home/foo/bar/baz').

The relevant fields in the result, according to 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.

So to make sense of the values, multiply by f_frsize:

import osstatvfs = os.statvfs('/home/foo/bar/baz')statvfs.f_frsize * statvfs.f_blocks     # Size of filesystem in bytesstatvfs.f_frsize * statvfs.f_bfree      # Actual number of free bytesstatvfs.f_frsize * statvfs.f_bavail     # Number of free bytes that ordinary users                                        # are allowed to use (excl. reserved space)


If you just need the free space on a device, see the answer using os.statvfs() below.

If you also need the device name and mount point associated with the file, you should call an external program to get this information. df will provide all the information you need -- when called as df filename it prints a line about the partition that contains the file.

To give an example:

import subprocessdf = subprocess.Popen(["df", "filename"], stdout=subprocess.PIPE)output = df.communicate()[0]device, size, used, available, percent, mountpoint = \    output.split("\n")[1].split()

Note that this is rather brittle, since it depends on the exact format of the df output, but I'm not aware of a more robust solution. (There are a few solutions relying on the /proc filesystem below that are even less portable than this one.)


As of Python 3.3, there an easy and direct way to do this with the standard library:

$ cat free_space.py #!/usr/bin/env python3import shutiltotal, used, free = shutil.disk_usage(__file__)print(total, used, free)$ ./free_space.py 1007870246912 460794834944 495854989312

These numbers are in bytes. See the documentation for more info.