如何在 python 中查找文件或目录的所有者
- 2024-11-13 08:36:00
- admin 原创
- 19
问题描述:
我需要 Python 中的函数或方法来查找文件或目录的所有者。
该功能应该是这样的:
>>> find_owner("/home/somedir/somefile")
owner3
解决方案 1:
我不太懂 Python,但我能够完成这个:
from os import stat
from pwd import getpwuid
def find_owner(filename):
return getpwuid(stat(filename).st_uid).pw_name
解决方案 2:
这是一个老问题,但对于那些正在寻找使用 Python 3 的更简单解决方案的人来说。
您还可以使用Path
frompathlib
来解决这个问题,通过像这样调用Path
的owner
和方法:group
from pathlib import Path
path = Path("/path/to/your/file")
owner = path.owner()
group = path.group()
print(f"{path.name} is owned by {owner}:{group}")
因此在这种情况下,方法可能如下:
from typing import Union
from pathlib import Path
def find_owner(path: Union[str, Path]) -> str:
path = Path(path)
return f"{path.owner()}:{path.group()}"
解决方案 3:
您想要使用os.stat()
:
os.stat(path)
Perform the equivalent of a stat() system call on the given path.
(This function follows symlinks; to stat a symlink use lstat().)
The return value is an object whose attributes correspond to the
members of the stat structure, namely:
- st_mode - protection bits,
- st_ino - inode number,
- st_dev - device,
- st_nlink - number of hard links,
- st_uid - user id of owner,
- st_gid - group id of owner,
- st_size - size of file, in bytes,
- st_atime - time of most recent access,
- st_mtime - time of most recent content modification,
- st_ctime - platform dependent; time of most recent metadata
change on Unix, or the time of creation on Windows)
获取所有者 UID 的使用示例:
from os import stat
stat(my_filename).st_uid
但是请注意,stat
返回的是用户 ID 号(例如,0 表示 root),而不是实际用户名。
解决方案 4:
我最近偶然发现了这一点,想要获取所有者用户和组信息,所以我想分享我的想法:
import os
from pwd import getpwuid
from grp import getgrgid
def get_file_ownership(filename):
return (
getpwuid(os.stat(filename).st_uid).pw_name,
getgrgid(os.stat(filename).st_gid).gr_name
)
解决方案 5:
下面是一些示例代码,展示如何找到文件的所有者:
#!/usr/bin/env python
import os
import pwd
filename = '/etc/passwd'
st = os.stat(filename)
uid = st.st_uid
print(uid)
# output: 0
userinfo = pwd.getpwuid(st.st_uid)
print(userinfo)
# output: pwd.struct_passwd(pw_name='root', pw_passwd='x', pw_uid=0,
# pw_gid=0, pw_gecos='root', pw_dir='/root', pw_shell='/bin/bash')
ownername = pwd.getpwuid(st.st_uid).pw_name
print(ownername)
# output: root
解决方案 6:
请参阅os.stat。它会告诉您st_uid
所有者的用户 ID。然后您必须将其转换为名称。为此,请使用pwd.getpwuid。
解决方案 7:
在 Windows 上,此方法有效,但使用命令行
import os
from subprocess import Popen, PIPE
from collections import namedtuple
def sliceit(iterable, tup):
return iterable[tup[0]:tup[1]].strip()
def convert_cat(line):
# Column Align Text indicies from cmd
# Date time dir filesize owner filename
Stat = namedtuple('Stat', 'date time directory size owner filename')
stat_index = Stat(date=(0, 11),
time=(11, 18),
directory=(18, 27),
size=(27, 35),
owner=(35, 59),
filename=(59, -1))
stat = Stat(date=sliceit(line, stat_index.date),
time=sliceit(line, stat_index.time),
directory=sliceit(line, stat_index.directory),
size=sliceit(line, stat_index.size),
owner=sliceit(line, stat_index.owner),
filename=sliceit(line, stat_index.filename))
return stat
def stat(path):
if not os.path.isdir(path):
dirname, filename = os.path.split(path)
else:
dirname = path
cmd = ["cmd", "/c", "dir", dirname, "/q"]
session = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)
# cp1252 is common on my Norwegian Computer,
# check encoding from your windows system
result = session.communicate()[0].decode('cp1252')
if os.path.isdir(path):
line = result.splitlines()[5]
return convert_cat(line)
else:
for line in result.splitlines()[5:]:
if filename in line:
return convert_cat(line)
else:
raise Exception('Could not locate file')
if __name__ == '__main__':
print(stat('C:\\temp').owner)
print(stat('C:\\temp\\diff.py'))
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD