Geo*_*lly 16 python unix linux filesystems
例如,我有一个包含以下路径的文件:
/media/my_mountpoint/path/to/file.txt
Run Code Online (Sandbox Code Playgroud)
我有完整的道路,想要得到:
/media/my_mountpoint
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?最好是在Python中,不使用外部库/工具.(两者都不是必需的.)
Fre*_*Foo 18
您可以调用该mount命令并解析其输出以查找路径中最长的公共前缀,或者使用stat系统调用来获取文件所在的设备并上到树中,直到您到达其他设备.
在Python中,stat可以使用如下(未经测试,可能必须扩展以处理符号链接和联合装置等异国情调的东西):
def find_mount_point(path):
path = os.path.abspath(path)
orig_dev = os.stat(path).st_dev
while path != '/':
dir = os.path.dirname(path)
if os.stat(dir).st_dev != orig_dev:
# we crossed the device border
break
path = dir
return path
Run Code Online (Sandbox Code Playgroud)
编辑:os.path.ismount直到现在我才知道.这大大简化了事情.
def find_mount_point(path):
path = os.path.abspath(path)
while not os.path.ismount(path):
path = os.path.dirname(path)
return path
Run Code Online (Sandbox Code Playgroud)
由于现在我们无法真正可靠地解析由或mount挂载文件系统的系统中的内容,因为输出可能包含以下内容:UUIDLABEL
(...)
/dev/disk/by-uuid/00000000-0000-0000-0000-000000000000 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
(...)
Run Code Online (Sandbox Code Playgroud)
我们需要一个更强大的解决方案(例如,考虑像上面这样的路径的“切割”部分可能会导致什么,以及我们是否想要类似的东西)。
一种这样的解决方案(顺便说一句,尽量不要重新发明轮子)是简单地使用命令stat来发现文件所在的挂载点,如下所示:
$ stat --printf "%h:%m:%i\n" Talks
6:/media/lattes:461246
Run Code Online (Sandbox Code Playgroud)
在上面的输出中,我们可以看到:
%h( ) 中的硬链接数量Talks为 6%m) 是/media/lattes%i) 是 461246。仅供记录,这是来自statGNU coreutils的版本,这意味着某些其他版本(例如 BSD)默认情况下可能没有它(但您始终可以使用您首选的包管理器安装它)。
因为python不是必需的:
df "$filename" | awk 'NR==1 {next} {print $6; exit}'
Run Code Online (Sandbox Code Playgroud)
的NR==1 {next}是跳过df,可以输出标题行.$6是挂载点.exit是为了确保我们只输出一行.
| 归档时间: |
|
| 查看次数: |
12787 次 |
| 最近记录: |