Linux 查找包含给定文件的文件系统的大小和可用空间
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4260116/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Find size and free space of the filesystem containing a given file
提问by Federico A. Ramponi
I'm using Python 2.6 on Linux. What is the fastest way:
我在 Linux 上使用 Python 2.6。最快的方法是什么:
to determine which partition contains a given directory or file?
For example, suppose that
/dev/sda2
is mounted on/home
, and/dev/mapper/foo
is mounted on/home/foo
. From the string"/home/foo/bar/baz"
I would like to recover the pair("/dev/mapper/foo", "home/foo")
.and then, to get usage statistics of the given partition? For example, given
/dev/mapper/foo
I would like to obtain the size of the partition and the free space available (either in bytes or approximately in megabytes).
确定哪个分区包含给定的目录或文件?
例如,假设
/dev/sda2
安装在 上/home
,并且/dev/mapper/foo
安装在 上/home/foo
。"/home/foo/bar/baz"
我想从字符串中恢复这对("/dev/mapper/foo", "home/foo")
。然后,获取给定分区的使用统计信息?例如,假设
/dev/mapper/foo
我想获取分区的大小和可用的可用空间(以字节为单位或大约以兆字节为单位)。
采纳答案by Sven Marnach
If you just need the free space on a device, see the answer using os.statvfs()
below.
如果您只需要设备上的可用空间,请参阅os.statvfs()
下面的答案。
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.
如果您还需要与文件关联的设备名称和挂载点,则应调用外部程序来获取此信息。df
将提供您需要的所有信息——当df filename
它被调用时,它会打印一行关于包含该文件的分区。
To give an example:
举个例子:
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()
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.)
请注意,这相当脆弱,因为它取决于df
输出的确切格式,但我不知道更强大的解决方案。(有一些解决方案依赖于/proc
下面的文件系统,它们的可移植性甚至低于这个。)
回答by ustun
Usually the /proc
directory contains such information in Linux, it is a virtual filesystem. For example, /proc/mounts
gives information about current mounted disks; and you can parse it directly. Utilities like top
, df
all make use of /proc
.
/proc
Linux中通常目录包含此类信息,它是一个虚拟文件系统。例如,/proc/mounts
提供有关当前挂载磁盘的信息;你可以直接解析它。实用程序之类的top
,df
都使用/proc
.
I haven't used it, but this might help too, if you want a wrapper: http://bitbucket.org/chrismiles/psi/wiki/Home
我没有用过它,但如果你想要一个包装器,这也可能有帮助:http: //bitbucket.org/chrismiles/psi/wiki/Home
回答by Hasturkun
For the first point, you can try using os.path.realpath
to get a canonical path, check it against /etc/mtab
(I'd actually suggest calling getmntent
, but I can't find a normal way to access it) to find the longest match. (to be sure, you should probably stat
both the file and the presumed mountpoint to verify that they are in fact on the same device)
对于第一点,您可以尝试使用os.path.realpath
获取规范路径,检查它/etc/mtab
(我实际上建议调用getmntent
,但我找不到访问它的正常方法)以找到最长的匹配。(可以肯定的是,您可能应该stat
同时使用文件和假定的挂载点来验证它们实际上位于同一设备上)
For the second point, use os.statvfs
to get block size and usage information.
对于第二点,用于os.statvfs
获取块大小和使用信息。
(Disclaimer: I have tested none of this, most of what I know came from the coreutils sources)
(免责声明:我没有测试过这些,我所知道的大部分内容都来自 coreutils 来源)
回答by tzot
import os
def get_mount_point(pathname):
"Get the mount point of the filesystem containing pathname"
pathname= os.path.normcase(os.path.realpath(pathname))
parent_device= path_device= os.stat(pathname).st_dev
while parent_device == path_device:
mount_point= pathname
pathname= os.path.dirname(pathname)
if pathname == mount_point: break
parent_device= os.stat(pathname).st_dev
return mount_point
def get_mounted_device(pathname):
"Get the device mounted at pathname"
# uses "/proc/mounts"
pathname= os.path.normcase(pathname) # might be unnecessary here
try:
with open("/proc/mounts", "r") as ifp:
for line in ifp:
fields= line.rstrip('\n').split()
# note that line above assumes that
# no mount points contain whitespace
if fields[1] == pathname:
return fields[0]
except EnvironmentError:
pass
return None # explicit
def get_fs_freespace(pathname):
"Get the free space of the filesystem containing pathname"
stat= os.statvfs(pathname)
# use f_bfree for superuser, or f_bavail if filesystem
# has reserved space for superuser
return stat.f_bfree*stat.f_bsize
Some sample pathnames on my computer:
我电脑上的一些示例路径名:
path 'trash':
mp /home /dev/sda4
free 6413754368
path 'smov':
mp /mnt/S /dev/sde
free 86761562112
path '/usr/local/lib':
mp / rootfs
free 2184364032
path '/proc/self/cmdline':
mp /proc proc
free 0
PS
聚苯乙烯
if on Python ≥3.3, there's shutil.disk_usage(path)
which returns a named tuple of (total, used, free)
expressed in bytes.
如果在 Python ≥3.3 上,则shutil.disk_usage(path)
返回以(total, used, free)
字节表示的命名元组。
回答by Giampaolo Rodolà
This should make everything you asked:
这应该使你问的一切:
import os
from collections import namedtuple
disk_ntuple = namedtuple('partition', 'device mountpoint fstype')
usage_ntuple = namedtuple('usage', 'total used free percent')
def disk_partitions(all=False):
"""Return all mountd partitions as a nameduple.
If all == False return phyisical partitions only.
"""
phydevs = []
f = open("/proc/filesystems", "r")
for line in f:
if not line.startswith("nodev"):
phydevs.append(line.strip())
retlist = []
f = open('/etc/mtab', "r")
for line in f:
if not all and line.startswith('none'):
continue
fields = line.split()
device = fields[0]
mountpoint = fields[1]
fstype = fields[2]
if not all and fstype not in phydevs:
continue
if device == 'none':
device = ''
ntuple = disk_ntuple(device, mountpoint, fstype)
retlist.append(ntuple)
return retlist
def disk_usage(path):
"""Return disk usage associated with path."""
st = os.statvfs(path)
free = (st.f_bavail * st.f_frsize)
total = (st.f_blocks * st.f_frsize)
used = (st.f_blocks - st.f_bfree) * st.f_frsize
try:
percent = ret = (float(used) / total) * 100
except ZeroDivisionError:
percent = 0
# NB: the percentage is -5% than what shown by df due to
# reserved blocks that we are currently not considering:
# http://goo.gl/sWGbH
return usage_ntuple(total, used, free, round(percent, 1))
if __name__ == '__main__':
for part in disk_partitions():
print part
print " %s\n" % str(disk_usage(part.mountpoint))
On my box the code above prints:
在我的盒子上,上面的代码打印:
giampaolo@ubuntu:~/dev$ python foo.py
partition(device='/dev/sda3', mountpoint='/', fstype='ext4')
usage(total=21378641920, used=4886749184, free=15405903872, percent=22.9)
partition(device='/dev/sda7', mountpoint='/home', fstype='ext4')
usage(total=30227386368, used=12137168896, free=16554737664, percent=40.2)
partition(device='/dev/sdb1', mountpoint='/media/1CA0-065B', fstype='vfat')
usage(total=7952400384, used=32768, free=7952367616, percent=0.0)
partition(device='/dev/sr0', mountpoint='/media/WB2PFRE_IT', fstype='iso9660')
usage(total=695730176, used=695730176, free=0, percent=100.0)
partition(device='/dev/sda6', mountpoint='/media/Dati', fstype='fuseblk')
usage(total=914217758720, used=614345637888, free=299872120832, percent=67.2)
回答by Mechanical snail
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')
.
这不会给出分区的名称,但您可以使用statvfs
Unix 系统调用直接获取文件系统统计信息。要从 Python 调用它,请使用os.statvfs('/home/foo/bar/baz')
.
The relevant fields in the result, according to POSIX:
结果中的相关字段,根据 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.
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
:
因此,要理解这些值,请乘以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)
回答by mosquito
The simplest way to find out it.
找出它的最简单方法。
import os
from collections import namedtuple
DiskUsage = namedtuple('DiskUsage', 'total used free')
def disk_usage(path):
"""Return disk usage statistics about the given path.
Will return the namedtuple with attributes: 'total', 'used' and 'free',
which are the amount of total, used and free space, in bytes.
"""
st = os.statvfs(path)
free = st.f_bavail * st.f_frsize
total = st.f_blocks * st.f_frsize
used = (st.f_blocks - st.f_bfree) * st.f_frsize
return DiskUsage(total, used, free)
回答by Xiong Chiamiov
As of Python 3.3, there an easy and direct way to do this with the standard library:
从 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
These numbers are in bytes. See the documentationfor more info.
这些数字以字节为单位。有关更多信息,请参阅文档。
回答by LawrenceLi
import os
def disk_stat(path):
disk = os.statvfs(path)
percent = (disk.f_blocks - disk.f_bfree) * 100 / (disk.f_blocks -disk.f_bfree + disk.f_bavail) + 1
return percent
print disk_stat('/')
print disk_stat('/data')
回答by andrew
For the second part of your question, "get usage statistics of the given partition", psutilmakes this easy with the disk_usage(path)function. Given a path, disk_usage()
returns a named tuple including total, used, and free space expressed in bytes, plus the percentage usage.
对于问题的第二部分,“获取给定分区的使用统计信息”,psutil使用disk_usage(path)函数使这变得容易。给定一个路径,disk_usage()
返回一个命名元组,包括以字节表示的总空间、已用空间和可用空间,以及使用百分比。
Simple example from documentation:
文档中的简单示例:
>>> import psutil
>>> psutil.disk_usage('/')
sdiskusage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)
Psutil works with Python versions from 2.6 to 3.6 and on Linux, Windows, and OSX among other platforms.
Psutil 适用于从 2.6 到 3.6 的 Python 版本以及 Linux、Windows 和 OSX 等平台。